0x1通过代码手动创建窗口  1.先放上代码: - #include <Windows.h>
- //全局hInstance句柄
- HINSTANCE hWindowInstance;
- //添加一个确认按钮
- void CreateButton1(HWND hwnd);
- //添加一个取消按钮
- void CreateButton2(HWND hwnd);
- //添加一个文本框
- void CreateTextBox(HWND hwnd);
- //消息循环函数
- LRESULT CALLBACK WndProc(
- HWND hwnd,
- UINT message,
- WPARAM wParam,
- LPARAM lParam
- );
- int WINAPI WinMain(
- HINSTANCE hInstance, // handle to current instance
- HINSTANCE hPrevInstance, // handle to previous instance
- LPSTR lpCmdLine, // command line
- int nCmdShow // show state
- )
- {
- hWindowInstance = hInstance;
- TCHAR lpszClassName[] = TEXT("my_window");
- //创建一个自己的窗口
- WNDCLASS wndclass = { 0 };//给所有成员默认赋值0,必须每一个成员赋值才能创建窗口,哪怕我们不需要使用它。
- //给成员赋值
- wndclass.hbrBackground = (HBRUSH)COLOR_MENU;//窗口背景色
- wndclass.lpszClassName = lpszClassName;// 窗口类名
- wndclass.hInstance = hInstance;//实例句柄
- wndclass.lpfnWndProc = WndProc;//消息循环函数
- //注册窗口类
- RegisterClass(&wndclass);
- //创建窗口
- HWND hwnd = CreateWindow(
- lpszClassName,//LPCTSTR lpClassName
- TEXT("小菜鸟一枚的窗口"),//LPCTSTR lpWindowName
- WS_OVERLAPPEDWINDOW,//DWORD dwStyle
- 100,//int x:指定窗口的初始水平位置
- 100,//int y:指定窗口的初始垂直位置
- 300,//int nWidth
- 300,//int nHeight
- NULL,//HWND hWndParent
- NULL,//HMENU hMenu
- hWindowInstance,//HANDLE hlnstance
- NULL//LPVOID lpParam
- );
- if (hwnd == NULL)//判断窗口是否创建成功
- {
- return 0;
- }
- CreateButton1(hwnd);//添加确认按钮
- CreateButton2(hwnd);//添加取消按钮
- CreateTextBox(hwnd);//添加一个文本框
- //显示窗口
- ShowWindow(hwnd, SW_SHOW);//hWnd:窗口句柄,nCmdShow:指定窗口如何显示。
- MSG msg;//定义一个消息结构体
- /*lpMsg:指向MSG结构的指针,该结构从线程的消息队列里接收消息信息。
- hWnd:取得其消息的窗口的句柄。这是一个有特殊含义的值(NULL)。GetMessage为任何属于调用线程的窗口检索消息,线程消息通过PostThreadMessage寄送给调用线程。
- wMsgFilterMin:指定被检索的最小消息值的整数。
- wMsgFilterMax:指定被检索的最大消息值的整数。*/
- while (GetMessage(&msg, NULL, 0, 0))
- {
- TranslateMessage(&msg);//翻译消息
- DispatchMessage(&msg);//分发消息
- }
- return 0;
- }
- //消息循环函数
- LRESULT CALLBACK WndProc(
- HWND hwnd,
- UINT message,
- WPARAM wParam,
- LPARAM lParam
- )
- {
- //处理消息
- switch (message)
- {
- case WM_DESTROY://关闭窗口
- ExitProcess(0);//进程结束
- default:
- break;
- }
- return DefWindowProc(hwnd, message, wParam, lParam);
- }
- //添加一个确认按钮
- void CreateButton1(HWND hwnd)
- {
- HWND buttonHwnd = CreateWindow(
- TEXT("button"),//LPCTSTR lpClassName
- TEXT("确认"),//LPCTSTR lpWindowName
- WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_DEFPUSHBUTTON,//DWORD dwStyle
- 10,//int x:指定窗口的初始水平位置
- 100,//int y:指定窗口的初始垂直位置
- 80,//int nWidth
- 30,//int nHeight
- hwnd,//HWND hWndParent
- (HMENU)1001,//HMENU hMenu
- hWindowInstance,//HANDLE hlnstance
- NULL//LPVOID lpParam
- );
- }
- //添加一个取消按钮
- void CreateButton2(HWND hwnd)
- {
- HWND buttonHwnd = CreateWindow(
- TEXT("button"),//LPCTSTR lpClassName
- TEXT("取消"),//LPCTSTR lpWindowName
- WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_DEFPUSHBUTTON,//DWORD dwStyle
- 100,//int x:指定窗口的初始水平位置
- 100,//int y:指定窗口的初始垂直位置
- 80,//int nWidth
- 30,//int nHeight
- hwnd,//HWND hWndParent
- (HMENU)1002,//HMENU hMenu
- hWindowInstance,//HANDLE hlnstance
- NULL//LPVOID lpParam
- );
- }
- //添加一个文本框
- void CreateTextBox(HWND hwnd)
- {
- HWND hEditResult = CreateWindow(
- TEXT("EDIT"), //建立文本框
- NULL,
- WS_CHILD | WS_VISIBLE | ES_RIGHT | WS_BORDER,
- 10, 50,
- 200, 30,
- hwnd,
- (HMENU)1003,
- hWindowInstance,
- NULL);
- }
复制代码
  2.首先创建一个窗口类,然后设置窗口类的属性,接着注册窗口,然后创建窗口,最后将窗口显示出来。   3.windows是事件驱动模式,基于消息处理各种事件。所以有了窗口后需要循环接收窗口传来的消息,将消息翻译和转发。在创建窗口类的时候我们要指定消息循环处理函数,所以我们要实现一个消息循环函数。
1)可以通过if-else,也可以switch-case处理消息
2)消息处理完后需要return返回,告诉window这条消息已经处理过了
3)我们没有处理的消息可以由window帮我们处理,return DefWindowProc(hwnd, message, wParam, lParam);   4.有了窗口为我们就能往里面添加组件了,与创建父窗口不一样,子窗口直接调用CreateWindow创建窗口。
1)TEXT("button"),window会帮我们创建一个这样的类
2)需要将窗口样式设置为WS_CHILD,并将父窗口句柄传进来
3)HMENU,可以直接给一个常量,强制转换即可,作为菜单标识。   5.如果要添加多个组件只需按照需要往里面添加即可,最终形成如上代码,运行结果见下图。

0x2通过资源文件创建窗口  1.首先还是创建一个空的win32项目,添加WinMain函数: - #include<Windows.h>
- int WINAPI WinMain(
- HINSTANCE hInstance, // handle to current instance
- HINSTANCE hPrevInstance, // handle to previous instance
- LPSTR lpCmdLine, // command line
- int nCmdShow // show state
- )
- {
- return 0;
- }
复制代码
  3.添加一个.rc资源文件,然后在资源视图-》添加资源-》新建dialog,如下图所示。

  4.创建完成会自带两个按钮,我们也可以自己添加,加入两个按钮长宽,不一样,水平没对齐,可以右上角的调整按钮,自动对齐和保持长宽一直。   5.在对话框窗口找到右侧的工具箱添加static text和edit control(一定不要在上面右键添加控件),例如标签文本,文本框等等,然后右键在属性里面设置它的标题等等,然后我们在看自动帮我们生成的资源头文件:
#define IDD_DIALOG1 101
#define IDC_EDIT1 1002
#define IDC_EDIT2 1003
#define IDC_BUTTON1 1004
#define IDC_BUTTON2 1005 这几个宏定义就是我们前面第一种方式创建窗口添加组件用到的(HMENU)。   6.对话框消息需要用WM_COMMAND和wParam组合获取,这里我使用的是edit control文本框,可以通过GetDlgItem和GetWindowText函数获取文本框的内容。   7.最后的代码如下: - #include <Windows.h>
- #include "resource.h"
- //对话框消息循环函数
- BOOL CALLBACK DialogProc(HWND hwndDlg, UINT UMsg, WPARAM wParam, LPARAM IParam);
- int WINAPI WinMain(
- HINSTANCE hInstance, // handle to current instance
- HINSTANCE hPrevInstance, // handle to previous instance
- LPSTR lpCmdLine, // command line
- int nCmdShow // show state
- )
- {
- /*
- hlnstance:标识一个模块的事例该模块的可执行文件含有对话框模板。
- IpTemplate:标识对话框模板。用MAKEINTRESOURCE宏指令创建此值。
- hWndParent:指定拥有对话框的窗口。
- IpDialogFunc:指向对话框过程的指针。
- */
- DialogBox( hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DialogProc);
- return 0;
- }
- //对话框消息循环函数
- BOOL CALLBACK DialogProc(HWND hwndDlg, UINT UMsg, WPARAM wParam, LPARAM IParam)
- {
- HWND hwndUser = NULL;
- HWND hwndPass = NULL;
- switch (UMsg)
- {
- case WM_COMMAND:
- switch (wParam)
- {
- case IDC_BUTTON1:
- TCHAR userBuf[50];
- TCHAR passBuf[50];
- hwndUser = GetDlgItem(hwndDlg, IDC_EDIT1);//获取第一个文本框句柄
- hwndPass = GetDlgItem(hwndDlg, IDC_EDIT2);//获取第二个文本框句柄
- //获取句柄里面的内容
- GetWindowText(hwndUser, userBuf, 50);
- GetWindowText(hwndPass, passBuf, 50);
- MessageBox(hwndDlg, TEXT("您点击了确认按钮!"), TEXT("小菜鸟提醒您:"), MB_ICONWARNING);
- return TRUE;
- case IDC_BUTTON2:
- MessageBox(hwndDlg, TEXT("您点击了取消按钮!"), TEXT("小菜鸟提醒您:"), MB_ICONWARNING);
- return TRUE;
- case IDCANCEL:
- ExitProcess(0);
- }
- }
- return FALSE;
- }
复制代码
0x3总结  1.通过dialogbox创建的窗口不能调用DefWindowProc,而是通过TRUE代表已经处理,FALSE代表交给系统处理。
  2.Window窗口如果不处理需要调用DefWindowProc函数,由系统处理消息。
  3.通过dialogBOX创建的对话框省略了窗口类的创建、注册和消息循环。
  4.通过PS将图片存储为ico格式文件,添加资源-》icon即可给生成的exe文件加上图标 0x4参考资料:WinAPI大全    S:善于总结,善于发现,找到分析问题的思路和解决问题的办法。虽然我现在还是零基础的小菜鸟一枚,也许逆天改命我会失败,但也有着成功的可能,只要还有希望,就决不放弃!
|