對話方塊的
skin
前段時間有些學生問我,怎麼給我們做的對話方塊加上漂亮的
skin
,特別是就像
qq遊戲的登入以及遊戲介面一樣(
qq遊戲的登入介面就是乙個對話方塊)。
經過一些曲折,我在
.codeproject.com
中找到了一些給對話方塊及控制項加
skin
的方式,在下面我通過乙個例子給出了其中一種最簡單的方法,通過這種方式作出的對話方塊會根據
skin
的大小調整。
在我的例子中,我用了首先做了乙個簡單的基於對話方塊的程式。然後給我們的工程插入乙個資源。給這個
bitmap
資源乙個資源id號
idb_main
。為對話方塊類加入以下的資料成員和成員函式。
cskindlg : public cdialog
;在建構函式中加入以下**:
cskindlg::cskintdlg(cwnd* pparent /*=null*/)
: cdialog(cskindlg::idd, pparent)
}afx_data_init
makeintresource(idb_main),
image_bitmap,0,0,lr_createdibsection);
m_hwndrgn=dibtn(m_hbmp,0x00ff00,false);
}在你的對話方塊類中插入函式hrgn dibtn(hbitmap hbmp, colorref bkcolor, bool direct)
,
並加入以下的**:
hrgn cskindlg ::dibtn(hbitmap hbmp, colorref bkcolor, bool direct)
;//design a void point to point to the bitmap
lpvoid pbit32;
//creat a dib
hbitmap hdib32 = createdibsection(hmemdc,
(bitmapinfo *)&bmpinfoh,
dib_rgb_colors, &pbit32, null, 0);
if (hdib32)
// get the bit point and do the search
byte *pbits = (byte *)bm32.bmbits +
(bm32.bmheight - 1) * bm32.bmwidthbytes;
for (int y = 0; y < bm.bmheight; y++)
}else if(direct)
else
break;
}if (x > x0)
rect *pr = (rect *)&prcdata->buffer;
setrect(&pr[prcdata->rdh.ncount], x0, y, x, y+1);
prcdata->rdh.rcbound.left = x0;
prcdata->rdh.rcbound.top = y;
prcdata->rdh.rcbound.right = x;
prcdata->rdh.rcbound.bottom = y+1;
prcdata->rdh.ncount++;
if (prcdata->rdh.ncount == 3000)
else
hrgn = tmphrgn;
prcdata->rdh.ncount = 0;
setrect(&prcdata->rdh.rcbound,
maxlong, maxlong, 0, 0);}}
}// search next line
pbits -= bm32.bmwidthbytes;
}hrgn tmphrgn = extcreateregion(null,
sizeof(rgndataheader) + (sizeof(rect) * maxrects), prcdata);
if (hrgn)
else
hrgn = tmphrgn;
// make a rect ,use this rect xor to thebkcolor
//then we can get the rect we want
if(!direct)
else
return null;
}//release the memory
heapfree(hrcdata,heap_no_serialize,prcdata);
selectobject(hdc, holdbmp);
deletedc(hdc);
deleteobject(holdbmp);
}selectobject(hmemdc,holdib32);
deletedc(hmemdc);
deleteobject(holdib32);
deleteobject(hdib32);
}else
deletedc(hmemdc);}}
return hrgn;
}加入乙個on_wm_erasebknd訊息,在這裡面刪除對話方塊的背景:
bool cskindlg::onerasebkgnd(cdc* pdc)
else
deletedc(hmemdc);}}
return cdialog::onerasebkgnd(pdc);
}最後在oninitdialog
中寫入以下**
bool cskindlg::oninitdialog()
這就是所有的過程,通過這個過程以後,我們的對話方塊的背景變為了我們引入的bitmap。
tuesday, september 20, 2005
對話方塊 訊息對話方塊
我們在使用windows系統的過程中經常會見到訊息對話方塊,提示我們有異常發生或提出詢問等。因為在軟體開發中經常用到訊息對話方塊,所以mfc提供了兩個函式可以直接生成指定風格的訊息對話方塊,而不需要我們在每次使用的時候都要去建立對話方塊資源和生成對話方塊類等。這兩個函式就是cwnd類的成員函式mes...
為對話方塊程式加上Accelerator(快捷鍵)
方法一 1 插入乙個新的accelerator到資源裡,把加速鍵和對應的響應控制項 如乙個按鈕 關聯 2 在對話方塊標頭檔案中宣告 haccel m haccel 3 在對話方塊的建構函式裡初始化m haccel m haccel loadaccelerators afxgetinstancehan...
mfc 改變對話方塊背景顏色
其中函式的第乙個引數指定了背景顏色,第二個引數指定了文字顏色。下面的例子是將應用程式對話方塊設定為藍色背景和紅色文字,步驟如下 新建乙個基於dialog的mfc initinstance 中新增如下 bool initinstance 編譯並執行,此時對話方塊的背景色和文本色已發生了改變。值得注意的...