獲取對話方塊當前cfont 自繪對話方塊

2021-10-17 01:33:17 字數 3427 閱讀 2463

閒來無事,寫了乙個簡單的對話方塊介面,希望給需要的朋友有所幫助。

介面如下:

介面很單調,我只是想說明一下如何實現介面的自繪。如果有需要,也可以繪製更複雜漂亮的介面。

程式的實現也不複雜,接下來就跟著我一步一步做。

首先,建立乙個基於對話方塊的應用程式。

接下來,在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...