[关闭]
@illuz 2015-01-09T03:13:30.000000Z 字数 7206 阅读 2377

Windows 程序设计 总结

复习


xxxlink:http://www.cnblogs.com/volcanol/tag/Windows%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1/
xxxlink2:http://see.xidian.edu.cn/cpp/u/window/


第一章

WinMain函数

  1. Int WINAPI WinMain( // 识别字__stdcall,(编译器)
  2. HINSTANCE hInstance // 当前实例的句柄
  3. HINSTANCE hPrevInstance// 先前实例的句柄,已废
  4. LPSTR lpCmdLine // 命令行参数字符串
  5. int nShowCmd); // 参数个数

MessageBox函数

  1. int WINAPI MessageBox(
  2. HWND hWnd, // 拥有窗
  3. LPCTSTR lpText, // 内容
  4. LPCTSTR lpCaption, // 标题
  5. UINT uType); // 按钮 MB_

Unicode与ASCII

使用_UNICODE宏

数据类型:

WCHAR Unicode字符
PWSTR 指向Unicode字符串的指针
PCWSTR 指向一个恒定的Unicode字符串的指针
对应的ANSI数据类型为CHAR,LPSTR和LPCSTR。
ANSI/Unicode通用数据类型为TCHAR,PTSTR,LPCTSTR

函数:

ANSI 操作函数以str开头 strcpy
Unicode 操作函数以wcs开头 wcscpy
MBCS 操作函数以_mbs开头 _mbscpy
ANSI/Unicode 操作函数以_tcs开头 _tcscpy(C运行期库)
ANSI/Unicode 操作函数以lstr开头 lstrcpy(Windows函数)
所有新的和未过时的函数在Windows2000中都同时拥有ANSI和Unicode两个版本。ANSI版本函数结尾以A表示;Unicode版本函数结尾以W表示。Windows会如下定义:

#ifdef UNICODE  
#define CreateWindowEx CreateWindowExW  
#else  
#define CreateWindowEx CreateWindowExA  
#endif // !UNICODE

表示Unicode字符串常量:

ANSI “string”
Unicode L“string”
ANSI/Unicode T(“string”)或_TEXT(“string”)if( szError[0] == _TEXT(‘J’) ){ }

缓存的大小

不应该传递sizeof(szBuffer),而应该传递(sizeof(szBuffer)/sizeof(TCHAR)。

判断

文本文件的开头两个字节是0xFF和0xFE,那幺就是Unicode,否则是ANSI


第二章

VirtualAlloc()函数(32位)

reverse->在虚拟地址空间内申请内存块
commit->把虚拟内存中的内存块变成RAM中可以访问的内存块

  1. LPVOID WINAPI VirtualAlloc()( // 返回指向分配到的内存块块起点的指针
  2. LPVOID lpAddress, // 指向内存块的指针,NULL为reverse,否则是commit
  3. DWORD dwSize, // 要申请内存块的块尺寸
  4. DWORD flAllocationType, // 分配到的内存块的类型
  5.     DWORD flProtect); // 保护类型

VirtualQuery()函数

  1. DWORD WINAPI VirtualQuery (
  2. LPCVOID lpvAddress, // 指向进行查询的存区开始地址
  3.     PMEMORY_BASIC_INFORMATION pmbi, // 存放页存区的有关信息
  4.     DWORD cblength); // 查询存区的长度(页数)

等等

第三章

API的三个核心

Win16 API Win32 API 说明
USER.EXE USER32.DLL USER组件负责窗口管理,包括消息,菜单,光标,通信,计时器和一些与窗口显示无关,但与控制窗口显示有关的函数。
GDI.EXE GDI32.DLL GDI是图形设备接口,它管理用户介面和图形绘制,包括windows元文件,位图,设备描述表和字体。
KRNL386.EXE KERNEL32.DLL KERNEL处理存贮器底层功能,任务和资源管理,它是Windows的核心。

第四章

窗口类结构WNDCLASS

  1. _WNDCLASS {
  2. UINT style = CS_HREDRAW | CS_VREDRAW;// 窗口类型
  3. WNDPROC lpfnWndProc = WndProc;//窗口处理函数
  4. int cbClsExtra = 0;//窗口扩展
  5. int cbWndExtra = 0;//窗口实例扩展
  6. HINSTANCE hInstance = hInstance;//实例句柄
  7. HICON hIcon = LoadIcon(NULL, IDI_APPLICATION);//窗口的最小化图标
  8. HCURSOR hCursor = LoadCursor(NULL, IDC_ARROW);//窗口鼠标光标
  9. HBRUSH hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//窗口背景色
  10. LPCTSTR lpszMenuName = NULL;//窗口菜单
  11. LPCTSTR lpszClassName = szAppName; // 窗口类名
  12. } WNDCLASS, *LPWNDCLASS;

窗口类的使用

定义完必须进行注册:
RegisterClass(&wndclass)
然后再创建窗口:

  1. hWnd = CreateWindow(szAppName, //窗口类名
  2. CW_USEDEFAULT, CW_USEDEFAULT, // 窗口坐标值为缺省值
  3. CW_USEDEFAULT, CW_USEDEFAULT, // 窗口的高和宽为缺省值
  4. NULL, //此窗口无父窗口
  5. NULL, //此窗口无子菜单
  6. hInstance, //创建此窗口的应用程序的当前句柄
  7. NULL //不使用该值
  8. )

窗口函数

窗口函数定义了应用程序对接收到的不同消息的响应。
消息来自GetMessage等方法。

  1. LRESULT CALLBACK WndProc( //WndProc名称可自由定义
  2. HWND hwnd, // 窗口句柄
  3. UINT uMsg, // 消息ID
  4. WPARAM wParam, // 两个消息参数
  5. LPARAM lParam
  6. );

使用switch和case结构来确定窗口函数接收的消息并处理它 。


第五章

几个与窗口类有关的函数

LoadIcon函数

  1. HICON WINAPI LoadIcon( // 返回的指向图标的指针,如果失败,返回NULL
  2. HINSTANCE hInstance, // 用户定义图标在哪个实例中, NULL为系统图标
  3. LPCSTR lpIconName // 图标名,也称图标上的标签
  4. );

LoadImage()函数

  1. HANDLE WINAPI LoadImage( // 图标的指针
  2. HINSTANCE hInstance,
  3. LPCTSTR lpszName, // 前两项与LoadIcon一样
  4. UNIT uType, // 图标格式,如IMAGE_BITMAP,IMAGE_CURSOR,IMAGE_ICON
  5. int cxDesired, // 图标的原始宽度
  6. int cyDesired, // 图标的原始高度
  7. UNIT fuLoad // 设置图标的尺寸,颜色,和属性,CR_开头
  8. );

LoadCursor()函数

  1. HCURSOR WINAPI LoadCursor ( // 返回新载入的光标的句柄
  2. HINSTANCE hInstance, // 载入的光标
  3. LPCTSTR lpCursorName) // 预定义的光标资源名

CreateSolidBrush()函数

  1. HBRUSH CreateSolidBrush( // 返回值标识一个逻辑刷子
  2. COLORREF crColor); // 刷子的颜色

第六章

WM_PAINT

Windows是通过发送WM_PAINT消息給窗口函数,使得窗口显示输出。

GDI函数

Windows系统中使用设备抽象成设备描述表,简称DC(实现设备无关性)。

PAINTSTRUCT 绘图信息结构

  1. typedef struct tagPAINTSTRUCT {
  2. HDC hdc; //输出设备的设备描述表
  3. BOOL fErase; //画图区域的背景要否擦去
  4. RECT rcPaint; //画图区域坐标,无效矩形的边界,
  5. BOOL fRestore; //操作系统用
  6. BOOL fIncUpdate; // 操作系统用
  7. BYTE rgbReserved[32]; // 操作系统用
  8. } PAINTSTRUCT ;

TextOut函数

  1. TextOut
  2. hdc, // 设备描述表
  3. x, y, // 位置
  4. psText, // 指向需要在窗口显示的字符串的指针
  5. iLength); // 输出字符串中字符的个数

重画区域的设定

InvalidateRect或InvalidateRgn函数直接产生WM_PAINT窗口消息
InvalidateRect设定的重画区是矩形,InvalidateRgn函数设定的重画区为不规则区域。

TEXTMETRIC

TEXTMETRIC结构有20个栏位:

  1. typedef struct tagTEXTMETRIC {
  2. LONG tmHeight; //字符高度
  3. LONG tmAscent; //字符上部高度(基线以上)
  4. LONG tmDescent; //字符下部高度(基线以下)
  5. LONG tmInternalLeading, //由tmHeight定义的字符高度的顶部空间数目
  6. LONG tmExternalLeading, //夹在两行之间的空间数目
  7. LONG tmAveCharWidth, //平均字符宽度
  8. LONG tmMaxCharWidth, //最宽字符的宽度
  9. LONG tmWeight; //字体的粗细轻重程度
  10. LONG tmOverhang, //加入某些拼接字体上的附加高度
  11. LONG tmDigitizedAspectX, //字体设计所针对的设备水平方向
  12. LONG tmDigitizedAspectY, //字体设计所针对的设备垂直方向
  13. BCHAR tmFirstChar; //为字体定义的第一个字符
  14. BCHAR tmLastChar; //为字体定义的最后一个字符
  15. BCHAR tmDefaultChar; //字体中所没有字符的替代字符
  16. BCHAR tmBreakChar; //用于拆字的字符
  17. BYTE tmItalic, //字体为斜体时非零
  18. BYTE tmUnderlined, //字体为下划线时非零
  19. BYTE tmStruckOut, //字体被删去时非零
  20. BYTE tmPitchAndFamily, //字体间距(低4位)和族(高4位)
  21. BYTE tmCharSet; //字体的字符集
  22. LONG tmAscent;//表示基于字符基准线上的高度。
  23. } TEXTMETRIC;

滚动条

利用CreateWindow函数生成窗口的时候,将窗口样式WS_VSCROLL和WS_HSCROLL位旗标加上即可生成具有垂直滚动条和水平滚动条的窗口。
可以通过 GetSystemMetrics 来获取垂直滚动条的宽度和水平滚动条的高度信息。

  1. BOOL SetScrollRange(
  2. HWND, // 窗口句柄
  3. int iBar, // 设置垂直(SB_VERT)还是水平(SB_HORZ)还是可控范围(SB_CTL)
  4. int iMinPos, int iMaxPos, // 最小最大
  5. BOOL bRedraw) // 改变是否重画
  1. BOOL SetScrollPos( // 设置滚动条的位置
  2. HWND hwnd, // 同SetScrollRange
  3. int iBar, // 同SetScrollRange
  4. int iPos, // 设定的滚动条的新的位置
  5. BOOL bRedraw); // 同SetScrollRange

获取滚动条的信息: GetScrollRange和GetScrollPos函数

使用ScrollInfo结构体
SetScrollInfo+GetScrollInfo函数

  1. int SetScrollInfo(
  2. HWND hWnd, // 同SetScrollRange
  3. int fnBar, // 同SetScrollRange
  4. LPSCROLLINFO lpsi, // 指向SCROLLINFO结构
  5. BOOL fRedraw) // 同SetScrollRange

SCROLLINFO结构

  1. typedef struct tagSCROLLINFO {
  2. UINT cbSize; // SCROLLINFO结构的大小
  3. UINT fMask; // 控制对本结构进行存取的控制码识别字
  4. int nMin; // 滚动范围最小值
  5. int nMax; // 滚动范围最大值
  6. UINT nPage; // 页面长度
  7. int nPos; // 滑块当前位置
  8. int nTrackPos; // 当前拖动位置
  9. }

第七章

GDI函数分类

  1. 取得(或建立)、释放(或清除)设备内容的函数
    • GetDC、ReleaseDC
    • BeginPaint、EndPaint
  2. 取得有关设备内容信息的函数
    • GetSystemMetrics
    • GetTextMetrics
  3. 绘图函数
    • Textout
  4. 设定和取得设备内容参数的函数
    • SetTextColor来指定TextOut函数所绘制文字的颜色
    • SetTextAlign指定TextOut函数中字符串的开始位置应该在字符串的右边还是默认的左边
  5. 使用GDI对象的函数

取得设备描述符

色彩

Full-color 显示器的分别率是每个图素24位: 8位红色、8位绿色和8为蓝色。 红、绿、蓝为色光三原色,混合这三种颜色可以生成各种其他的颜色。

High-color 显示分辨率每个图素16位: 5位红色、6为绿色、5位蓝色, 因为人眼对绿色敏感,所以多一位。

在大多数GDI函数调用中,使用COLORREF值(是一个32位的无正负号长整数)表示色彩。

可以通过GetDeviceCaps函数获取显示卡的储存组织以及显卡支持的颜色数目:
iPlanes=GetDeviceCaps(hdc,PLANES);
iBitsPixel=GetDeviceCaps(hdc,BITSPIXEL);

画点画线

画点
SetPixel (hdc, x, y, crColor);
crColor = GetPixel (hdc, x, y);
画线

画笔

建立画笔CreatePen和CreatePenIndirect
HPEN CreatePen(int nPenStyle, int nWidth, COLORREF crColor); 设置样式宽度和颜色
HPEN CreatePenIndirect( _In_ const LOGPEN *lplgpn); 使用LOGPEN结构体创建画笔

将这画笔选进设备内容并用它来画线:
SelectObject (hdc, hPen);

删除画笔:
DeleteObject (hPen);

如果直接使用SelectObject (hdc, CreatePen (PS_DASH, 0, RGB (255, 0, 0)));,可以通过传回HPEN来删除:DeleteObject (SelectObject (hdc, GetStockObject (BLACK_PEN)));,或者直接在将新建立的画笔选进设备内容时,保存SelectObject传回的画笔句柄:hPen = SelectObject (hdc, CreatePen (PS_DASH, 0, RGB (255, 0, 0)));再进行删除。

GetObject提取LOGPENGetObject (hPen, sizeof (LOGPEN), (LPVOID) &logpen);
当前画笔:hPen = GetCurrentObject (hdc, OBJ_PEN);


第八章


第九章

基础

  1. // GetSystemMetrics函数
  2. fMouse = GetSystemMetrics (SM_MOUSEPRESENT); // fMouse鼠标是否存在
  3. cButtons = GetSystemMetrics (SM_CMOUSEBUTTONS); // 鼠标按键的个数
  4. wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);// 在定义窗口类别结构时指定特定窗口的内定光标

显示区域鼠标消息:(非显示区域鼠标消息则在前面+NC)

按下 释放 按下(双键)
WM_LBUTTONDOWN WM_LBUTTONUP WM_LBUTTONDBLCLK
WM_MBUTTONDOWN WM_MBUTTONUP WM_MBUTTONDBLCLK
WM_RBUTTONDOWN WM_RBUTTONUP WM_RBUTTONDBLCLK
  1. // lParam值均含有鼠标的位置,可以用LOWORD和HIWORD宏来提取这些值
  2. x = LOWORD (lParam) ;
  3. y = HIWORD (lParam) ;
  4. // wParam的值指示鼠标按键以及Shift和Ctrl键的状态
  5. isShift = wparam & MK_SHIFT; // Shift键的状态,MK_LBUTTON,MK_MBUTTON,MK_RBUTTON,MK_CONTROL
  6. // 客户端与屏幕坐标转换
  7. ScreenToClient (hwnd, &pt);
  8. ClientToScreen (hwnd, &pt);

until 命中测试消息

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注