首先还是将窗口的框架直接复制过来
#include <windows.h>
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static char szWndClassName[] = "hellowin";
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ;
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szWndClassName ;
if (!RegisterClass (&wndclass))
{
MessageBox (NULL, "注册失败",
"错误", MB_ICONERROR) ;
return 0 ;
}
hwnd = CreateWindow (szWndClassName, // window class name
"窗口标题", // window caption
WS_OVERLAPPEDWINDOW, // window style
CW_USEDEFAULT, // initial x position
CW_USEDEFAULT, // initial y position
CW_USEDEFAULT, // initial x size
CW_USEDEFAULT, // initial y size
NULL, // parent window handle
NULL, // window menu handle
hInstance, // program instance handle
NULL) ; // creation parameters
ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;
while (GetMessage (&msg, NULL, 0, 0)) //消息队列
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ; //WM_QUIT
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc ;
PAINTSTRUCT ps ;
RECT rect ;
switch (message)
{
case WM_CREAT:
case WM_PAINT:
hdc = BeginPaint (hwnd, &ps) ;
GetClientRect (hwnd, &rect) ;
DrawText (hdc, TEXT ("在屏幕中心输出文字"), -1, &rect,
DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
EndPaint (hwnd, &ps) ;
return 0 ;
case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
创建按钮(子窗口)
CreateWindow("Button", "点我", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,200, 200, 100, 30, hwnd, NULL, hAppInstance, NULL);
“Button“是系统内置的按钮(窗口)类,除此之外,还有编辑框(Edit)、下拉列表(ComboBox)、列表框(ListBox)、滚动条(Scrollbar)等一系列控件。菜单句柄参数可以用作ID来标识这些控件,CreateWindow函数返回此控件句柄。
也就是说这些控件全部是基于我们父窗口的一系列子窗口
关于这个函数主要就是
这个应用程序实例句柄是一开始windows操作系统传进来的参数 我定义一个全局变量 然后赋值 在主函数中获取它 、
但是当我们有多个控件应该怎样去区分它们呢?
最简单的方法就是去定义窗口变量区分
但是我们也可以通过id来区分
子窗口给父窗口发消息
当用户从菜单选中一个命令项目、当一个控件发送通知消息给父窗口或者按下一个快捷键将发送 WM_COMMAND 消息 如果这个消息是由子窗口控件产生,如button产生则: LOWORD(wParam): 控件ID HIWORD(wParam): 通知码 lParam: 子窗口句柄 注:双击通知码(BN_DOUBLECLICKED)仅当下压按钮风格包括BS_NOTIFY 时才发送。
LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam) hWnd:其窗口程序将接收消息的窗口的句柄。 Msg:指定被发送的消息。 wParam:指定附加的消息特定信息。 IParam:指定附加的消息特定信息。 返回值:返回值指定消息处理的结果,依赖于所发送的消息。
因为我们是一个按钮 并没有菜单句柄 所以我们将菜单句柄的低位字作为id 高位字作为通知码 也就是消息的类型
为了规范我们最好能够对于ID进行定义宏
下面我们来看通知码的作用
我们想要区分双击和单击
前面的所有都是子窗口给父窗口发送消息来让父窗口创建新的子窗口
父窗口给子窗口发消息
LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam) hWnd:其窗口程序将接收消息的窗口的句柄。 Msg:指定被发送的消息。 wParam:指定附加的消息特定信息。 IParam:指定附加的消息特定信息。 返回值:返回值指定消息处理的结果,依赖于所发送的消息。
设置按钮上显示文字 SendMessage(hButton,WM_SETTEXT,(WPARAM)NULL,(LPARAM)"我是按钮"); 设置单选框的选中状态 SendMessage(hRadio,BM_SETCHECK,1,0); 获得单选框选中状态 int isChecked=SendMessage(hRadio, BM_GETCHECK, 0, 0); 向下拉列表插入项目 SendMessage(hComboBox,CB_INSERTSTRING,-1,(LPARAM)"计算机"); 获得下拉列表选中项索引 int index=SendMessage(hComboBox, CB_GETCURSEL, 0, 0);
这里static至关重要 具体看这篇 https://blog.csdn.net/viafcccy/article/details/85311187
#include <windows.h>
HINSTANCE hAppInstance;
#define IDB_BUTTON1 100
#define IDB_BUTTON2 200
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static char szWndClassName[] = "hellowin";
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ;
hAppInstance = hInstance;
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szWndClassName ;
if (!RegisterClass (&wndclass))
{
MessageBox (NULL, "注册失败",
"错误", MB_ICONERROR) ;
return 0 ;
}
hwnd = CreateWindow (szWndClassName, // window class name
"窗口标题", // window caption
WS_OVERLAPPEDWINDOW, // window style
CW_USEDEFAULT, // initial x position
CW_USEDEFAULT, // initial y position
CW_USEDEFAULT, // initial x size
CW_USEDEFAULT, // initial y size
NULL, // parent window handle
NULL, // window menu handle
hInstance, // program instance handle
NULL) ; // creation parameters
ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;
while (GetMessage (&msg, NULL, 0, 0)) //消息队列
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ; //WM_QUIT
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc ;
PAINTSTRUCT ps ;
RECT rect ;
switch (message)
{
case WM_CREATE:
CreateWindow("Button", "快来点我", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON | BS_NOTIFY ,200, 200, 100, 30, hwnd, (HMENU)IDB_BUTTON1, hAppInstance, NULL);
CreateWindow("Button", "不要点我", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,400, 200, 100, 30, hwnd, (HMENU)IDB_BUTTON2, hAppInstance, NULL);
return 0;
case WM_COMMAND:
{
switch(LOWORD(wParam))
{
case 100:
{
if((HIWORD(wParam)==BN_DOUBLECLICKED))
{
MessageBox(hwnd,"点两下更舒服","",MB_OK);
break ;
}
}
break ;
case 200:
{
MessageBox(hwnd,"讨厌","",MB_OK);
}
break ;
}
}
return 0 ;
case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}