鬱悶,今天弄了一下午就爲了弄明白一件事,爲什麼我之前創建的對話框左上角有圖標,而今天它死活不肯出來,搞了半天終於知道原來是用錯函數了。。。
SetClassLong(hwndDlg,GCL_HICON,(long)hIcon);
SendMessage(hwndDlg,WM_SETICON,ICON_BIG,(long)hIcon);
SendDlgItemMessage(hwndDlg,IDD_DIALOG,WM_SETICON,ICON_BIG,(long)hIcon);
這三個咋一看長得差不多,尤其是最後兩個
SendDlgItemMessage是爲了方便向對話框中的控件發送消息而設立的,而我卻剛好栽在這個函數上
實踐證明,要向對話框窗口發送消息,還是SendMessage函數靠譜些,SendDlgItemMessage可能會不起效果
SetClassLong是個非常好的函數,可以用它來設置圖標、光標(光標一定要用這個函數,用WM_SETCURSOR沒用的)等等,其他的我也沒用過就不清楚了
最後附上源碼吧,其實現在想起來也感覺當時蠻傻的,居然糾結了一下午,還以爲是編譯器出問題了,連電腦都重啓過。。。
#include "stdafx.h"
#include "resource.h"
HICON hIcon;
int CALLBACK DialogProc( HWND hwndDlg, // handle to dialog box
UINT uMsg, // message
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{
switch (uMsg)
{
case WM_INITDIALOG:
//SetClassLong(hwndDlg,GCL_HICON,(long)hIcon);//有效
SendMessage(hwndDlg,WM_SETICON,ICON_BIG,(long)hIcon);//有效
//SendDlgItemMessage(hwndDlg,IDD_DIALOG,WM_SETICON,ICON_BIG,(long)hIcon);//無效
break;
case WM_CLOSE:
//DeleteObject(hIcon);
EndDialog(hwndDlg,NULL);
break;
default:
return FALSE;
}
return TRUE;
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
hIcon=LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON2));
DialogBoxParam(hInstance,(LPCTSTR)IDD_DIALOG1,NULL,DialogProc,0);
return 0;
}