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;

其他参数

HBRUSH参数表示背景的颜色,会自动填充,如果这个值没有就会让程序员自己在进行操作后进行背景的操作

HICON表示的是资源句柄,用来修改各种图标光标等资源

lpszMenuName表示菜单资源的名字,这里用来添加菜单资源

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操作系统,然后操作系统将消息分发给窗口,窗口再调用自己的响应函数去处理消息。

创建窗口,创建窗口响应

 创建窗口类,注册窗口类,创建窗口,显示窗口,捕获窗口消息,消息响应

 1 //总代码
 2 #include<Windows.h>
 3 #include<iostream>
 4 
 5 LRESULT CALLBACK WindowProc(
 6 HWND hwnd,
 7 UINT uMsg,
 8 WPARAM wParam,
 9 LPARAM lParam
10 )
11 {
12 switch (uMsg)
13 {
14 case WM_CREATE:
15 MessageBox(hwnd, L"窗口创建成功", L"创建窗口", MB_OK);
16 break;
17 default:
18 break;
19 }
20 return DefWindowProc(hwnd,uMsg,wParam,lParam);
21 }
22 int WINAPI WinMain(
23 HINSTANCE hInstance,
24 HINSTANCE hPrevInstance,
25 LPSTR lpCmdLine,
26 int nShowCmd
27 )
28 {
29 //1 创建一个窗口类
30 WNDCLASS myclass = { 0 };
31 myclass.lpszClassName = L"sm7";
32 myclass.lpfnWndProc = WindowProc;
33 
34 //2注册窗口类
35 RegisterClass(&myclass);
36 
37 //3创建窗口
38 HWND hMyWindow = CreateWindow(
39 myclass.lpszClassName,
40 L"sm7的窗口",
41 WS_BORDER,
42 CW_USEDEFAULT,
43 0,
44 CW_USEDEFAULT,
45 0,
46 NULL,
47 NULL,
48 hInstance,
49 NULL
50 );
51 
52 
53 //4显示窗口
54 ShowWindow(hMyWindow, SW_SHOW);
55 
56 //5获取消息
57 MSG message;
58 LPMSG MESSAGE = &message;
59 while (1)
60 {
61 GetMessage(MESSAGE,hMyWindow,0,0);
62 DispatchMessage(MESSAGE);
63 }
64 return 0;
65 }
View Code