菜单和其他资源(4)之对话框的建立与如何添加窗口左上角的小ICON图标
前面的博客有一篇专门写了《如何创建自己的ICON图标》,在讲对话框之前,先讲一下如何修改窗口左上角的小图标,这个跟exe的ICON图标有点不一样,不是直接在CreateWindow的倒数第三个参数=LoadIcon(NULL,MAKEINTRESOURCE(ICONID))就行了,这样只是对exe大图标有用,详细请看我的前面的博客。
其实32X32和16X16的ICON图标的ID是一样的。这两者的创建都是一样的,有什么疑问请看博客:菜单和其他资源(1)如何画自己的ICON图标。
这里创建了两个ICON图标,一个16X16的,一个是32X32的
32X32的这样加载:
wndclass.Icon=LoadIcon(NULL,MAKEINTRESOURCE(ICONID));
16X16的这样加载:
SendMessage(hwnd, WM_SETICON, (WPARAM)TRUE, (LPARAM)LoadIcon(GetModuleHandle(NULL), (LPCTSTR)ICONID));
//hWnd为窗口句柄//TRUE表示用大图标//GetModuleHandle(NULL)表示获得当前应用程序实例//IDI_APP为当前程序资源中一个图标的ID//如果提示找不到IDI_APP,请在该文件前几行添上一句#include "resource.h",这样才会把资源ID载入
看看效果吧:
ICON讲到这里,下面看看如何创建自己的对话框
现在讲的是最简单的,只是说明一下,如何创建的问题,后面的博客会有更复杂的对话框。
1新建一个win32项目,然后编写自己的代码;
2新建资源,创建自己的ICON和MENU
3新建资源,创建自己的对话框,在编辑对话框的时候,可也拖拽控件,just like C#(对话框里面拉一个picture,type改成Icon,Image改成ICONID)
对话框也可以添加菜单等等。。。
看看具体的代码:
#include<windows.h>#include"resource.h"BOOL CALLBACK DialogProc(HWND hDlg,UINT uMsg,WPARAM wParam,LPARAM lParam);//声明一个对话框过程函数LRESULT CALLBACK WindowProc( HWND hwnd, // handle to window UINT uMsg, // message identifier WPARAM wParam, // first message parameter LPARAM lParam // second message parameter);HINSTANCE hInst;int WINAPI WinMain( HINSTANCE hInstance, // handle to current instance HINSTANCE hPrevInstance, // handle to previous instance LPSTR lpCmdLine, // command line int nCmdShow // show state){static TCHAR szAppName[]=TEXT("leimingzi");HWND hwnd;MSG msg;WNDCLASS wndclass;//HWND hDlg;HMENU hMenu;hInst=hInstance;wndclass.cbClsExtra=0;wndclass.cbWndExtra=DLGWINDOWEXTRA;wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);wndclass.hIcon=LoadIcon(NULL,MAKEINTRESOURCE(ICONID));//exe大图标wndclass.hInstance=hInstance;wndclass.lpfnWndProc=WindowProc;wndclass.lpszClassName=szAppName;wndclass.lpszMenuName=NULL;wndclass.style=CS_HREDRAW|CS_VREDRAW;if(!RegisterClass(&wndclass))//注册窗口{MessageBox(NULL,TEXT("the program require the window nt"),TEXT("tips"),MB_ICONERROR);return 0;}hMenu=LoadMenu(hInstance,MAKEINTRESOURCE(MENUID));//加载菜单hwnd=CreateWindow( szAppName, // registered class name TEXT("this is title"), // window name WS_OVERLAPPEDWINDOW, // window style CW_USEDEFAULT, // horizontal position of window CW_USEDEFAULT, // vertical position of window CW_USEDEFAULT, // window width CW_USEDEFAULT, // window height NULL, // handle to parent or owner window hMenu, // menu handle or child identifier hInstance, // handle to application instance NULL // window-creation data);//hDlg=CreateDialogParam(hInstance,MAKEINTRESOURCE(DIALOGID),hwnd,NULL,NULL);ShowWindow(hwnd,nCmdShow);UpdateWindow(hwnd);while(GetMessage(&msg,NULL,0,0)){TranslateMessage(&msg);DispatchMessage(&msg);}return msg.wParam;}LRESULT CALLBACK WindowProc( HWND hwnd, // handle to window UINT uMsg, // message identifier WPARAM wParam, // first message parameter LPARAM lParam // second message parameter){static HINSTANCE hinstance;static HWND hDlg;static HICON hIcon;switch(uMsg){case WM_CREATE:hinstance=((LPCREATESTRUCT)lParam)->hInstance;SendMessage(hwnd, WM_SETICON, (WPARAM)TRUE, (LPARAM)LoadIcon(GetModuleHandle(NULL), (LPCTSTR)ICONID));//添加窗口小图标return 0;case WM_COMMAND:switch(LOWORD(wParam))//菜单事件处理{case ID_HELP_HELP:DialogBox(hinstance,MAKEINTRESOURCE(DIALOGID),hwnd,DialogProc);//弹出一个模态对话框MessageBeep(0);//发出系统声音break;}return 0;case WM_DESTROY:PostQuitMessage(0);return 0;}return DefWindowProc(hwnd,uMsg,wParam,lParam);}BOOL CALLBACK DialogProc(HWND hDlg,UINT uMsg,WPARAM wParam,LPARAM lParam){switch(uMsg){case WM_INITDIALOG://初始化对话框return TRUE;case WM_COMMAND:switch(LOWORD(wParam)){case IDOK:EndDialog(hDlg,0);return TRUE;}break;}return FALSE;}
图标的创建:
效果图