閒來無事,寫了乙個簡單的對話方塊介面,希望給需要的朋友有所幫助。
介面如下:
介面很單調,我只是想說明一下如何實現介面的自繪。如果有需要,也可以繪製更複雜漂亮的介面。
程式的實現也不複雜,接下來就跟著我一步一步做。
首先,建立乙個基於對話方塊的應用程式。
接下來,在ctestdlg類中新增兩個成員函式:
// in ctestdlg.h
public:
void drawview();
hbitmap creategradientbmp(hdc hdc,colorref cl1,colorref cl2,int nwidth,int nheight,int ndir,int nnumcolors);函式的具體內容如下:// in ctestdlg.cpp
void ctestdlg::drawview()
cpaintdc dc(this);
crect rect;
cstring strtext="test. hello world! 你好,vckbase!"; //文字內容
getclientrect(rect);
rect.right=27; //自繪區域寬度
colorrefm_clrsidebarstart; //自繪區域起始處顏色
colorrefm_clrsidebarend; //自繪區域結束處顏色
m_clrsidebarstart=rgb(205,205,205); //灰色
m_clrsidebarend=rgb(100,0,0); //褐色
//建立圖及繪製區域
hbitmapbmpbar = creategradientbmp(
dc.m_hdc, m_clrsidebarstart, m_clrsidebarend,
rect.width(), rect.height(),
0, 256);
if (bmpbar)
cdc memdc;
memdc.createcompatibledc(&dc);
hbitmap holdbmp = (hbitmap)::selectobject(memdc.m_hdc, bmpbar);
dc.bitblt(rect.left, rect.top,
rect.width(), rect.height(),
&memdc, 0, 0, srccopy);
::selectobject(memdc, holdbmp);
::deleteobject(bmpbar);
//繪製文字
cfontvertfont;
//字型
vertfont.createfont(16, 0, 900, 900, fw_bold,
0, 0, 0, default_charset, out_default_precis,
clip_default_precis, default_quality,
default_pitch, "arial");
cfont *poldfont = dc.selectobject(&vertfont);
colorref oldcolor = dc.gettextcolor();
dc.settextcolor(rgb(255, 255, 255)); //文字顏色
dc.setbkmode(transparent);
dc.textout(rect.left 2, rect.bottom-4, strtext); //文字起始位置
dc.settextcolor(oldcolor);
dc.selectobject(poldfont);
vertfont.deleteobject();
}//建立圖hbitmap ctestdlg::creategradientbmp(hdc hdc, colorref cl1, colorref cl2, int nwidth, int nheight, int ndir, int nnumcolors)
if(nnumcolors > 256)
nnumcolors = 256;
colorref palval[256];
memset(palval, 0, sizeof(colorref)*256);
int nindex;
byte pered=0,pegreen=0,peblue=0;
int r1=getrvalue(cl1);
int r2=getrvalue(cl2);
int g1=get**alue(cl1);
int g2=get**alue(cl2);
int b1=getbvalue(cl1);
int b2=getbvalue(cl2);
for (nindex = 0; nindex < nnumcolors; nindex )
pered = (byte) (r1 muldiv((r2-r1),nindex,nnumcolors-1));
pegreen = (byte) (g1 muldiv((g2-g1),nindex,nnumcolors-1));
peblue = (byte) (b1 muldiv((b2-b1),nindex,nnumcolors-1));
palval[nindex]=(pered << 16) | (pegreen << 8) | (peblue);
int x,y,w,h;
w=nwidth;
h=nheight;
lpdwordpgradbits;
bitmapinfogradbitinfo;
pgradbits=(dword*) malloc(w*h*sizeof(dword));
memset(&gradbitinfo,0,sizeof(bitmapinfo));
gradbitinfo.bmiheader.bisize=sizeof(bitmapinfoheader);
gradbitinfo.bmiheader.biwidth=w;
gradbitinfo.bmiheader.biheight=h;
gradbitinfo.bmiheader.biplanes=1;
gradbitinfo.bmiheader.bibitcount=32;
gradbitinfo.bmiheader.bicompression=bi_rgb;
if(ndir==0)
for(y=0;y接下來在ctestdlg類的onpaint()中新增**:void ctestdlg::onpaint()
if (isiconic())
//省略原始碼……….
else
this->drawview(); //此句為自新增
cdialog::onpaint();
好了,現在編譯執行即可。
祝各位程式設計快樂!
輸入您的搜尋字詞
提交搜尋表單
自繪對話方塊標題欄
本例中將涉及到對話方塊標題欄的自繪,雙緩衝點陣圖的顯示以及位圖按鈕類的使用。1.標題欄自繪 2.雙緩衝顯示位圖 雙緩衝顯示點陣圖的原理網上介紹的比較多,主要思路如下 本例中的ctestbitmapshowdlg主測試類中位圖的顯示,以及ccolortitledlg標題欄重繪類中標題欄的貼圖操作都是使...
8 VC ui 自繪對話方塊基類
所有的對話方塊都是基於cdialog的,也就都具有cdialog的特徵,本文以cdialog為基類派生乙個新的類cskindialogbase,只需將基於cdialog的對話方塊中cdialog替換成cskindialogbase,則可具有自繪dlg的特徵.下面例子是自己重繪了非客戶區及客戶區底色完...
獲取對話方塊當前cfont VC呼叫系統字型對話方塊
1 通過mfc類呼叫字型對話方塊 2 通過win32api函式呼叫字型對話方塊 通過mfc類呼叫字型對話方塊 cfontdialog 建構函式 cfontdialog lplogfont lplfinitial null,dword dwflags cf effects cf screenfonts...