Windows编程-图形化框架

Windows编程-图形化框架

创建窗口

1 创建一个窗口类-WNDCLASS

typedef struct tagWNDCLASSA {
UINT     style;
WNDPROC   lpfnWndProc;
int       cbClsExtra;
int       cbWndExtra;
HINSTANCE hInstance;
HICON     hIcon;
HCURSOR   hCursor;
HBRUSH   hbrBackground;
LPCSTR   lpszMenuName;
LPCSTR   lpszClassName;
} WNDCLASSA, *PWNDCLASSA, *NPWNDCLASSA, *LPWNDCLASSA;

其中的第二个参数lpfnWndProc,和lpszClassName必须要有

    WNDCLASS myclass = { 0 };
WCHAR lpszClassName[] = TEXT("Sm7");
myclass.lpszClassName = lpszClassName;
myclass.lpfnWndProc = NULL;

2 注册窗口类-RegisterClass

ATOM RegisterClass(
const WNDCLASS *lpWndClass
);

参数

参数表明的是自己创建的窗口类的指针

返回值

如果函数成功,则返回值是一个类原子,它唯一地标识正在注册的类。这个类原子只有由具体的Windows函数来操作

如果创建失败则返回值为0

3 创建窗口-CreateWindow

void CreateWindowW(
  lpClassName,
  lpWindowName,
  dwStyle,
  x,
  y,
  nWidth,
  nHeight,
  hWndParent,
  hMenu,
  hInstance,
  lpParam
);

参数

第一个参数表示刚刚注册的窗口的类名

第二个参数表示窗口的名字

第三个参数表示窗口的风格,这个有很多的宏定义

第四个和第五个参数表示窗口的初始位置

第六个和第七个参数表示窗口的宽度和高度

第七个参数 hWndParent表示窗口的父窗口或所有者的句柄

第八个参数hMenu表示窗口的菜单的句柄

第九个参数hInstance表示WINMAIN函数的实例句柄

第十个参数lpParam 是用来调用回调函数的参数

    WCHAR My_Window_Name[] = L"sm7的窗口";
LPCWSTR Point_My_Window_Name = My_Window_Name;
CreateWindowW(
lpszClassName,
Point_My_Window_Name,
WS_BORDER,
CW_USEDEFAULT,
0,
CW_USEDEFAULT,
100,
NULL,
NULL,
NULL,
NULL
);

返回值

如果成功则返回窗口的句柄

如果失败则返回NULL

4 显示窗口-ShowWindow

BOOL ShowWindow(
HWND hWnd,
int nCmdShow
);

参数

第一个hWnd表示窗口句柄

第二个参数nCmdShow表示显示的风格

消息

windows系统是基于消息的操作系统

每个窗口都在处理消息,所有的操作都是有操作响应后的操作

产生消息的机制叫做消息循环,处理消息的窗口调用回调函数来处理消息

消息的产生

消息的分类

1 user主动产生的消息

2 Windows系统自己产生的消息

3 应用程序自己的消息

4 其他程序产生的消息

应用程序如何接受消息

windows有系统消息队列,每个GUI程序程序也都有自己的消息队列,系统消息队列负责将系统发给不同GUI程序的消息队列。应用程序获取本程序消息队列的信息,然后将消息发给消息处理函数来处理消息。

消息的API函数

GetMessage 从消息队列中取出1个消息
BOOL GetMessage(
LPMSG lpMsg,
HWND hWnd,
UINT wMsgFilterMin,
UINT wMsgFilterMax
);

参数:

第一个lpMsg表示消息的结构体的指针,用的是一个MSG的结构体

第二个参数hWnd表示获取的消息的窗口的句柄,这个句柄必须属于当前线程

第三个和第四个参数表示获取的消息范围,第三个表示消息最低整数值,第四个表示最高整数值,如果都为0表示获取所有的消息。

DispatchMessage 将消息发送给消息处理函数
LRESULT DispatchMessage(
const MSG *lpMsg
);
消息处理函数

这里的函数就是你自己的类里面的lpfnWndProc函数,这个函数需要在类的时候就把参数传进去,消息处理函数有自己的格式

LRESULT CALLBACK WindowProc(
HWND   hwnd,
UINT   uMsg,
WPARAM wParam,
LPARAM lParam
);

第一个参数表示的是窗口的句柄,

第二个参数表示要处理的消息的类型

第三和第四个参数表示附加消息,这个取决于uMsg参数的值

 

返回值:类型:LRESULT

返回值是消息处理的结果,并取决于发送的消息。

肯定不可能处理完所有的响应所以这里需要用到另一个API函数DefWindowProc来用系统的默认处理来未处理的消息

LRESULT CALLBACK WindowProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
switch (uMsg)
{
case WM_CREATE:
MessageBox(hwnd, L"窗口创建成功", L"创建窗口", MB_OK);
break;
default:
break;
}
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}

总结

Windows编程也就是在Windows下进行编程,编程分为GUI和CUI,GUI就是图形化编程,CUI就是命令行下编程。这次是GUI编程也就是Windows下图形化编程。Windows的GUI编程就是窗口化编程每一个可以看到的图形编程都是看为窗口

首先创建一个窗口,创建窗口的流程为:创建窗口类,注册窗口类,创建窗口,显示窗口。然后这个窗口需要配合着别的东西来处理,也就是配合Windows下的消息来处理。Windows系统有自己的消息处理队列,Windows系统会将属于该窗口的消息发给该窗口的消息队列,那么该窗口只需要针对自己的消息队列来处理消息。窗口对于消息来进行响应。

当窗口有消息时,消息先发给Windows操作系统,然后操作系统将消息分发给窗口,窗口再调用自己的响应函数去处理消息。

创建窗口,创建窗口响应

 

//总代码
#include<Windows.h>
#include<iostream>
?
LRESULT CALLBACK WindowProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
switch (uMsg)
{
case WM_CREATE:
MessageBox(hwnd, L"窗口创建成功", L"创建窗口", MB_OK);
break;
default:
break;
}
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nShowCmd
)
{
//1 创建一个窗口类
WNDCLASS myclass = { 0 };
myclass.lpszClassName = L"sm7";
myclass.lpfnWndProc = WindowProc;
?
//2注册窗口类
RegisterClass(&myclass);
?
//3创建窗口
HWND hMyWindow = CreateWindow(
myclass.lpszClassName,
L"sm7的窗口",
WS_BORDER,
CW_USEDEFAULT,
0,
CW_USEDEFAULT,
0,
NULL,
NULL,
hInstance,
NULL
);
?
?
//4显示窗口
ShowWindow(hMyWindow, SW_SHOW);
?
//5获取消息
MSG message;
LPMSG MESSAGE = &message;
while (1)
{
GetMessage(MESSAGE,hMyWindow,0,0);
DispatchMessage(MESSAGE);
}
return 0;
}
?
?

 

Windows编程-图形化框架

上一篇:[WPF] 轮播滚动文字,走马灯效果实现


下一篇:C#——封装系统API库hid.dll报错引发的一系列问题