对话框中显示图标的实现方法
在对话框中显示图标的实现方法:
第一种,这种方法是一种较为简单的实现方法,在设计对话框的样式的时候,利用图像控件生成一个矩形区域,点击属性按钮,在类型的那个地方选择图标,在图像的那栏中输入图标资源名称。当然这种情况下,不能够在标题栏处显示图标。即:
第二种情况,在对话框过程处理WM_INITDIALOG消息中,通过调用SetClassLong函数来设置图标。在这种情况下,图标出现在标题栏处。代码:
在这里就有一个问题了,如果在主窗口中创建的是动态图标的话,那么怎么让对话框中的图标显示与程序图标显示一致呢?
在这里我个人的解决方法是,生成一个计时器,让其与窗口过程函数的计时器的时间间隔一致,然后,在WM_TIMER消息中调用SetClassLong函数来实现对话框中的图标与窗口过程函数设置的图标相一致。具体的代码为:
好了,以上就是个人对于对话框图标显示的解决方法。
以下是这个程序的全部代码:(在这个程序中我加载了18个图标资源)
#include <windows.h> #include <tchar.h> #include "resource.h" LRESULT CALLBACK WndProc(HWND hwnd , UINT message , WPARAM wparam , LPARAM lparam); BOOL CALLBACK AboutDialogProc(HWND hwnd , UINT message , WPARAM wparam , LPARAM lparam); int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { MSG msg; HWND hwnd; WNDCLASS wndclass; TCHAR ClassName[] = _T("Dialog program !"); TCHAR MenuName[] = _T("DialogMenu"); wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.hCursor = LoadCursor(NULL , IDC_ARROW); wndclass.hIcon = LoadIcon(hInstance , MAKEINTRESOURCE(IDI_ICON1)); wndclass.hInstance = hInstance; wndclass.lpfnWndProc = WndProc; wndclass.lpszClassName = ClassName; wndclass.lpszMenuName = MenuName; wndclass.style = CS_HREDRAW | CS_VREDRAW; RegisterClass(&wndclass); hwnd = CreateWindow(ClassName , ClassName , WS_OVERLAPPEDWINDOW , CW_USEDEFAULT , CW_USEDEFAULT , CW_USEDEFAULT , CW_USEDEFAULT , NULL , NULL , hInstance , NULL); ShowWindow(hwnd , nCmdShow); UpdateWindow(hwnd); while(GetMessage(&msg , NULL , 0 , 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK WndProc(HWND hwnd , UINT message , WPARAM wparam , LPARAM lparam) { static HINSTANCE hinstance; static int icon[] = {IDI_ICON2 , IDI_ICON3 , IDI_ICON4 , IDI_ICON5 , IDI_ICON6 , IDI_ICON7 , IDI_ICON8 , IDI_ICON9 , IDI_ICON10 , IDI_ICON11 , IDI_ICON12 , IDI_ICON13 , IDI_ICON14 , IDI_ICON15 , IDI_ICON16 , IDI_ICON17 , IDI_ICON18 , IDI_ICON19 }; static int iconSelect; switch(message) { case WM_CREATE: hinstance = ((LPCREATESTRUCT)lparam)->hInstance; SetTimer(hwnd , 1 , 588 , NULL); break; case WM_TIMER: SetClassLong(hwnd , GCL_HICON , (LONG)LoadIcon( hinstance , MAKEINTRESOURCE( icon[iconSelect++ % 18] ) ) ); break; case WM_COMMAND: DialogBoxParam(hinstance , MAKEINTRESOURCE(IDD_DIALOG) , hwnd , AboutDialogProc , 0); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd , message , wparam , lparam); } return 0; } BOOL CALLBACK AboutDialogProc(HWND hwnd , UINT message , WPARAM wparam , LPARAM lparam) { switch(message) { case WM_INITDIALOG: SetClassLong(hwnd , GCL_HICON , (LONG)GetClassLong(GetParent(hwnd) , GCL_HICON)); SetTimer(hwnd , 1 , 588 , NULL); return TRUE; case WM_TIMER: SetClassLong(hwnd , GCL_HICON , (LONG)GetClassLong(GetParent(hwnd) , GCL_HICON)); return TRUE; case WM_COMMAND: switch(LOWORD(wparam)) { case IDOK: case IDCANCEL: EndDialog(hwnd , 0); return TRUE; } return TRUE; } return FALSE; }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。