WINDOWS核心编程--Windows程序内部运行机制(下)

简介: WINDOWS核心编程--Windows程序内部运行机制

更新窗口


UpdateWindow
The UpdateWindow function updates the client area of the specified window by sending a WM_PAINT message to the window if the window’s update region is not empty. The function sends a WM_PAINT message directly to the window procedure of the specified window, bypassing the application queue. If the update region is empty, no message is sent.
Copy to Clipboard
BOOL UpdateWindow(
  HWND hWnd
);


消息循环


调用GetMessage

1668342950509.jpg

不断从消息队列取出消息,并进行相应。

GetMessageW(
    _Out_ LPMSG lpMsg,
    _In_opt_ HWND hWnd,
    _In_ UINT wMsgFilterMin,
    _In_ UINT wMsgFilterMax);
#ifdef UNICODE


  • lpMsg----------指向MSG结构体
  • hWnd-----------指定接受属于哪个窗口的消息,通常设置NULL,接受属于线程的所有窗口的消息
  • wMsgFilterMin指定要获取消息的最小值----------常0
  • wMsgFilterMax-------------------常0,接受所哟消息
  • GetMessage TranslateMessage DispatchMessage 和PeekMessage
  • Because the return value can be nonzero, zero, or -1, avoid code like this:
while (GetMessage( lpMsg, hWnd, 0, 0)) ...
The possibility of a -1 return value in the case that hWnd is an invalid parameter (such as referring to a window that has already been destroyed) means that such code can lead to fatal application errors. Instead, use code like this:

在 hWnd 是无效参数的情况下返回值为 -1的可能性(例如引用已经被销毁的窗口)意味着这样的代码可能导致致命的应用程序错误。相反,应该这样使用代码:

BOOL bRet;
while( (bRet = GetMessage( &msg, hWnd, 0, 0 )) != 0)
{
if (bRet == -1)
{
// handle the error and possibly exit
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}


TranslateMessage—将虚拟键消息转化为字符消息


字符消息被投递到调用线程的消息队列

调用getMessage的时候被取出

敲击键盘,产生

1668343101540.jpg

这两个消息附加参数-----虚拟键代码和扫描码

我们程序中只要得到某个字符的ASCII码

BOOL TranslateMessage(
  CONST MSG *lpMsg
);


TranslateMessage把KEYDOWN和KEYUP消息的组合转换为一条WM_CHAR消息

TranslateMessage不修改源消息,只产生新消息投递到消息队列


DispatchMessage----分派一个消息到窗口过程


分派一个消息到窗口过程

实际上是将消息回传给操作系统

LRESULT DispatchMessage( CONST MSG *lpMsg );

PeekMessage


函数功能


PeekMessage是一个Windows API函数。该函数为一个消息检查线程消息队列,并将该消息(如果存在)放于指定的结构。


函数声明


WINUSERAPI
BOOL
WINAPI
PeekMessageW(
    _Out_ LPMSG lpMsg,
    _In_opt_ HWND hWnd,
    _In_ UINT wMsgFilterMin,
    _In_ UINT wMsgFilterMax,
    _In_ UINT wRemoveMsg);


第一个参数

lpMsg接收消息信息的MSG结构指针。


第二个参数

hWnd其消息被检查的窗口句柄。


第三个参数

wMsgFilterMin指定被检查的消息范围里的第一个消息。


第四个参数

wMsgFilterMax指定被检查的消息范围里的最后一个消息。


第五个参数

wRemoveMsg确定消息如何被处理。此参数可取下列值之一:


windows应用程序的消息处理机制


windows消息机制详解

1668343173367.jpg

1668343181474.jpg


编写窗口过程函数


匈牙利命名法

举例来说,表单的名称为form,那么在匈牙利命名法中可以简写为frm,则当表单变量名称为Switchboard时,变量全称应该为 frmSwitchboard。这样可以很容易从变量名看出Switchboard是一个表单,同样,如果此变量类型为标签,那么就应命名成 lblSwitchboard。可以看出,匈牙利命名法非常便于记忆,而且使变量名非常清晰易懂,这样,增强了代码的可读性,方便各程序员之间相互交流代码。


变量属性


属性部分:

g_ 全局变量

c_  常量

m_  c++类成员变量

s_  静态变量



类型部分:

数组 a

指针 p

函数 fn

无效 v

句柄 h

长整型 l

布尔 b

浮点型(有时也指文件) f

双字  dw

字符串  sz

短整型  n

双精度浮点 d

计数 c(通常用cnt)

字符 ch(通常用c)

整型 i(通常用n)

字节 by

字 w

实型 r

无符号 u

描述部分:

最大 Max

最小 Min

初始化 Init

临时变量 T(或Temp)

源对象 Src

目的对象 Dest


MFC、句柄、控件及结构的命名规范:


Windows类型 样本变量;MFC类 样本变量
HWND hWnd; CWnd* pWnd;
HDLG hDlg; CDialog* pDlg;
HDC hDC; CDC* pDC;
HGDIOBJ hGdiObj; CGdiObject* pGdiObj;
HPEN hPen; CPen* pPen;
HBRUSH hBrush; CBrush* pBrush;
HFONT hFont; CFont* pFont;
HBITMAP hBitmap; CBitmap* pBitmap;
HPALETTE hPaltte; CPalette* pPalette;
HRGN hRgn; CRgn* pRgn;
HMENU hMenu; CMenu* pMenu;
HWND hCtl; CState* pState;
HWND hCtl; CButton* pButton;
HWND hCtl; CEdit* pEdit;
HWND hCtl; CListBox* pListBox;
HWND hCtl; CComboBox* pComboBox;
HWND hCtl; CScrollBar* pScrollBar;
HSZ hszStr; CString pStr;
POINT pt; CPoint pt;
SIZE size; CSize size;
RECT rect; CRect rect;


一般前缀命名规范:


前缀&类型&实例


C 类或结构 CDocument,CPrintInfo

m_ 成员变量 m_pDoc,m_nCustomers


变量命名规范:


前缀&类型&描述&实例
ch char 8位字符 chGrade
ch TCHAR 如果_UNICODE定义,则为16位字符 chName
b BOOL 布尔值 bEnable
n int 整型(其大小依赖于操作系统) nLength
u UINT 无符号值(其大小依赖于操作系统) uHeight
w WORD 16位无符号值 wPos
l LONG 32位有符号整型 lOffset
dw DWORD 32位无符号整型 dwRange
p * 指针 pDoc
lp FAR* 远指针 lpszName
lpsz LPSTR 32位字符串指针 lpszName
lpsz LPCSTR 32位常量字符串指针 lpszName
lpsz LPCTSTR 如果_UNICODE定义,则为32位常量字符串指针 lpszName
h handle Windows对象句柄 hWnd
lpfn callback 指向CALLBACK函数的远指针


前缀_符号类型:

前缀_符号类型实例&范围
IDR_ 不同类型的多个资源共享标识 IDR_MAIINFRAME 1~0x6FFF
IDD_ 对话框资源 IDD_SPELL_CHECK 1~0x6FFF
HIDD_ 对话框资源的Help上下文 HIDD_SPELL_CHECK 0x20001~0x26FF
IDB_ 位图资源 IDB_COMPANY_LOGO 1~0x6FFF
IDC_ 光标资源 IDC_PENCIL 1~0x6FFF
IDI_ 图标资源 IDI_NOTEPAD 1~0x6FFF
ID_ 来自菜单项或工具栏的命令 ID_TOOLS_SPELLING 0x8000~0xDFFF
HID_ 命令Help上下文 HID_TOOLS_SPELLING 0x18000~0x1DFFF
IDP_ 消息框提示 IDP_INVALID_PARTNO 8~0xDEEF
HIDP_ 消息框Help上下文 HIDP_INVALID_PARTNO 0x30008~0x3DEFF
IDS_ 串资源 IDS_COPYRIGHT 1~0x7EEF
IDC_ 对话框内的控件 IDC_RECALC 8~0xDEEF


Microsoft MFC宏命名规范:


名称&类型

_AFXDLL 唯一的动态连接库(Dynamic Link Library,DLL)版本

_ALPHA 仅编译DEC Alpha处理器

_DEBUG 包括诊断的调试版本

_MBCS 编译多字节字符集

_UNICODE 在一个应用程序中打开Unicode

AFXAPI MFC提供的函数

CALLBACK 通过指针回调的函数


库标识符命名法:


标识符&值和含义

u ANSI(N)或Unicode(U)

d 调试或发行:D = 调试;忽略标识符为发行。


静态库版本命名规范:


库&描述

NAFXCWD.LIB 调试版本:MFC静态连接库

NAFXCW.LIB 发行版本:MFC静态连接库

UAFXCWD.LIB 调试版本:具有Unicode支持的MFC静态连接库

UAFXCW.LIB 发行版本:具有Unicode支持的MFC静态连接库


动态连接库命名规范:


名称&类型

_AFXDLL 唯一的动态连接库(DLL)版本

WINAPI Windows所提供的函数

Windows.h中新的命名规范:

类型&定义描述

WINAPI 使用在API声明中的FAR PASCAL位置,如果正在编写一个具有导出API人口点的DLL,则可以在自己的API中使用该类型

CALLBACK 使用在应用程序回叫例程,如窗口和对话框过程中的FAR PASCAL的位置

LPCSTR 与LPSTR相同,只是LPCSTR用于只读串指针,其定义类似(const char FAR*)

UINT 可移植的无符号整型类型,其大小由主机环境决定(对于Windows NT和Windows 9x为32位);它是unsigned int的同义词

LRESULT 窗口程序返回值的类型

LPARAM 声明lParam所使用的类型,lParam是窗口程序的第四个参数

WPARAM 声明wParam所使用的类型,wParam是窗口程序的第三个参数

LPVOID 一般指针类型,与(void *)相同,可以用来代替LPSTR


相关文章
|
1月前
|
消息中间件 编译器 API
Windows窗口程序
Windows窗口程序
|
2月前
|
Windows
实现Windows程序的数据更新
实现Windows程序的数据更新
13 0
|
2月前
|
Windows
构建布局良好的Windows程序
构建布局良好的Windows程序
11 0
|
2月前
|
C# Windows
初识Windows程序
初识Windows程序
11 0
|
1月前
|
人工智能 机器人 编译器
【C++】Windows端VS code中运行CMake工程(手把手教学)
【C++】Windows端VS code中运行CMake工程(手把手教学)
|
1月前
|
人工智能 机器人 编译器
【C++】Windows端VS code中运行CMake工程(手把手教学)
【C++】Windows端VS code中运行CMake工程(手把手教学)
|
1月前
|
编译器 C语言 C++
|
2天前
|
Windows
LabVIEW启用/禁用Windows屏幕保护程序
LabVIEW启用/禁用Windows屏幕保护程序
13 4
LabVIEW启用/禁用Windows屏幕保护程序
|
6天前
|
存储 安全 搜索推荐
Windows之隐藏特殊文件夹(自定义快捷桌面程序)
Windows之隐藏特殊文件夹(自定义快捷桌面程序)
|
8天前
|
Oracle Java 关系型数据库
windows 下 win11 JDK17安装与环境变量的配置(配置简单详细,包含IJ中java文件如何使用命令运行)
本文介绍了Windows 11中安装JDK 17的步骤,包括从官方网站下载JDK、配置环境变量以及验证安装是否成功。首先,下载JDK 17的安装文件,如果没有Oracle账户,可以直接解压缩文件到指定目录。接着,配置系统环境变量,新建`JAVA_HOME`变量指向JDK安装路径,并在`Path`变量中添加。然后,通过命令行(cmd)验证安装,分别输入`java -version`和`javac -version`检查版本信息。最后,作者分享了如何在任意位置运行Java代码,包括在IntelliJ IDEA(IJ)中创建的Java文件,只需去掉包声明,就可以通过命令行直接运行。