@illuz
2015-01-09T03:13:30.000000Z
字数 7206
阅读 2377
复习
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/
Int WINAPI WinMain( // 识别字__stdcall,(编译器)
HINSTANCE hInstance, // 当前实例的句柄
HINSTANCE hPrevInstance,// 先前实例的句柄,已废
LPSTR lpCmdLine, // 命令行参数字符串
int nShowCmd); // 参数个数
int WINAPI MessageBox(
HWND hWnd, // 拥有窗
LPCTSTR lpText, // 内容
LPCTSTR lpCaption, // 标题
UINT uType); // 按钮 MB_
使用_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
reverse->在虚拟地址空间内申请内存块
commit->把虚拟内存中的内存块变成RAM中可以访问的内存块
LPVOID WINAPI VirtualAlloc()( // 返回指向分配到的内存块块起点的指针
LPVOID lpAddress, // 指向内存块的指针,NULL为reverse,否则是commit
DWORD dwSize, // 要申请内存块的块尺寸
DWORD flAllocationType, // 分配到的内存块的类型
DWORD flProtect); // 保护类型
DWORD WINAPI VirtualQuery (
LPCVOID lpvAddress, // 指向进行查询的存区开始地址
PMEMORY_BASIC_INFORMATION pmbi, // 存放页存区的有关信息
DWORD cblength); // 查询存区的长度(页数)
Win16 API | Win32 API | 说明 |
---|---|---|
USER.EXE | USER32.DLL | USER组件负责窗口管理,包括消息,菜单,光标,通信,计时器和一些与窗口显示无关,但与控制窗口显示有关的函数。 |
GDI.EXE | GDI32.DLL | GDI是图形设备接口,它管理用户介面和图形绘制,包括windows元文件,位图,设备描述表和字体。 |
KRNL386.EXE | KERNEL32.DLL | KERNEL处理存贮器底层功能,任务和资源管理,它是Windows的核心。 |
_WNDCLASS {
UINT style = CS_HREDRAW | CS_VREDRAW;// 窗口类型
WNDPROC lpfnWndProc = WndProc;//窗口处理函数
int cbClsExtra = 0;//窗口扩展
int cbWndExtra = 0;//窗口实例扩展
HINSTANCE hInstance = hInstance;//实例句柄
HICON hIcon = LoadIcon(NULL, IDI_APPLICATION);//窗口的最小化图标
HCURSOR hCursor = LoadCursor(NULL, IDC_ARROW);//窗口鼠标光标
HBRUSH hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//窗口背景色
LPCTSTR lpszMenuName = NULL;//窗口菜单
LPCTSTR lpszClassName = szAppName; // 窗口类名
} WNDCLASS, *LPWNDCLASS;
定义完必须进行注册:
RegisterClass(&wndclass)
然后再创建窗口:
hWnd = CreateWindow(szAppName, //窗口类名
CW_USEDEFAULT, CW_USEDEFAULT, // 窗口坐标值为缺省值
CW_USEDEFAULT, CW_USEDEFAULT, // 窗口的高和宽为缺省值
NULL, //此窗口无父窗口
NULL, //此窗口无子菜单
hInstance, //创建此窗口的应用程序的当前句柄
NULL //不使用该值
)
窗口函数定义了应用程序对接收到的不同消息的响应。
消息来自GetMessage等方法。
LRESULT CALLBACK WndProc( //WndProc名称可自由定义
HWND hwnd, // 窗口句柄
UINT uMsg, // 消息ID
WPARAM wParam, // 两个消息参数
LPARAM lParam
);
使用switch和case结构来确定窗口函数接收的消息并处理它 。
LoadIcon函数
HICON WINAPI LoadIcon( // 返回的指向图标的指针,如果失败,返回NULL
HINSTANCE hInstance, // 用户定义图标在哪个实例中, NULL为系统图标
LPCSTR lpIconName // 图标名,也称图标上的标签
);
LoadImage()函数
HANDLE WINAPI LoadImage( // 图标的指针
HINSTANCE hInstance,
LPCTSTR lpszName, // 前两项与LoadIcon一样
UNIT uType, // 图标格式,如IMAGE_BITMAP,IMAGE_CURSOR,IMAGE_ICON
int cxDesired, // 图标的原始宽度
int cyDesired, // 图标的原始高度
UNIT fuLoad // 设置图标的尺寸,颜色,和属性,CR_开头
);
LoadCursor()函数
HCURSOR WINAPI LoadCursor ( // 返回新载入的光标的句柄
HINSTANCE hInstance, // 载入的光标
LPCTSTR lpCursorName) // 预定义的光标资源名
CreateSolidBrush()函数
HBRUSH CreateSolidBrush( // 返回值标识一个逻辑刷子
COLORREF crColor); // 刷子的颜色
Windows是通过发送WM_PAINT消息給窗口函数,使得窗口显示输出。
Windows系统中使用设备抽象成设备描述表,简称DC(实现设备无关性)。
typedef struct tagPAINTSTRUCT {
HDC hdc; //输出设备的设备描述表
BOOL fErase; //画图区域的背景要否擦去
RECT rcPaint; //画图区域坐标,无效矩形的边界,
BOOL fRestore; //操作系统用
BOOL fIncUpdate; // 操作系统用
BYTE rgbReserved[32]; // 操作系统用
} PAINTSTRUCT ;
TextOut(
hdc, // 设备描述表
x, y, // 位置
psText, // 指向需要在窗口显示的字符串的指针
iLength); // 输出字符串中字符的个数
InvalidateRect或InvalidateRgn函数直接产生WM_PAINT窗口消息
InvalidateRect设定的重画区是矩形,InvalidateRgn函数设定的重画区为不规则区域。
TEXTMETRIC结构有20个栏位:
typedef struct tagTEXTMETRIC {
LONG tmHeight; //字符高度
LONG tmAscent; //字符上部高度(基线以上)
LONG tmDescent; //字符下部高度(基线以下)
LONG tmInternalLeading, //由tmHeight定义的字符高度的顶部空间数目
LONG tmExternalLeading, //夹在两行之间的空间数目
LONG tmAveCharWidth, //平均字符宽度
LONG tmMaxCharWidth, //最宽字符的宽度
LONG tmWeight; //字体的粗细轻重程度
LONG tmOverhang, //加入某些拼接字体上的附加高度
LONG tmDigitizedAspectX, //字体设计所针对的设备水平方向
LONG tmDigitizedAspectY, //字体设计所针对的设备垂直方向
BCHAR tmFirstChar; //为字体定义的第一个字符
BCHAR tmLastChar; //为字体定义的最后一个字符
BCHAR tmDefaultChar; //字体中所没有字符的替代字符
BCHAR tmBreakChar; //用于拆字的字符
BYTE tmItalic, //字体为斜体时非零
BYTE tmUnderlined, //字体为下划线时非零
BYTE tmStruckOut, //字体被删去时非零
BYTE tmPitchAndFamily, //字体间距(低4位)和族(高4位)
BYTE tmCharSet; //字体的字符集
LONG tmAscent;//表示基于字符基准线上的高度。
} TEXTMETRIC;
利用CreateWindow函数生成窗口的时候,将窗口样式WS_VSCROLL和WS_HSCROLL位旗标加上即可生成具有垂直滚动条和水平滚动条的窗口。
可以通过 GetSystemMetrics 来获取垂直滚动条的宽度和水平滚动条的高度信息。
BOOL SetScrollRange(
HWND, // 窗口句柄
int iBar, // 设置垂直(SB_VERT)还是水平(SB_HORZ)还是可控范围(SB_CTL)
int iMinPos, int iMaxPos, // 最小最大
BOOL bRedraw) // 改变是否重画
BOOL SetScrollPos( // 设置滚动条的位置
HWND hwnd, // 同SetScrollRange
int iBar, // 同SetScrollRange
int iPos, // 设定的滚动条的新的位置
BOOL bRedraw); // 同SetScrollRange
获取滚动条的信息: GetScrollRange和GetScrollPos函数
使用ScrollInfo结构体
SetScrollInfo+GetScrollInfo函数
int SetScrollInfo(
HWND hWnd, // 同SetScrollRange
int fnBar, // 同SetScrollRange
LPSCROLLINFO lpsi, // 指向SCROLLINFO结构
BOOL fRedraw) // 同SetScrollRange
SCROLLINFO结构
typedef struct tagSCROLLINFO {
UINT cbSize; // SCROLLINFO结构的大小
UINT fMask; // 控制对本结构进行存取的控制码识别字
int nMin; // 滚动范围最小值
int nMax; // 滚动范围最大值
UINT nPage; // 页面长度
int nPos; // 滑块当前位置
int nTrackPos; // 当前拖动位置
}
HDC BeginPaint(HWND, PAINTSTRUCT *)
和EndPaint(HWND, PAINTSTURCT *)
HDC GetDC(HWND)
和int ReleaseDC(HWMD ,HDC)
HDC GetWindowDC(HWND)
和int ReleaseDC(HWMD ,HDC)
hdc=CreateDC(pszDriver,pszDevice,pszOutput,pData);
和DeleteDC(hdc);
仅需要获取一个设备内容的设备内容信息而不需进行绘制时,可以使用CreateC。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);
第八章
第九章
// GetSystemMetrics函数
fMouse = GetSystemMetrics (SM_MOUSEPRESENT); // fMouse鼠标是否存在
cButtons = GetSystemMetrics (SM_CMOUSEBUTTONS); // 鼠标按键的个数
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 |
// lParam值均含有鼠标的位置,可以用LOWORD和HIWORD宏来提取这些值
x = LOWORD (lParam) ;
y = HIWORD (lParam) ;
// wParam的值指示鼠标按键以及Shift和Ctrl键的状态
isShift = wparam & MK_SHIFT; // Shift键的状态,MK_LBUTTON,MK_MBUTTON,MK_RBUTTON,MK_CONTROL
// 客户端与屏幕坐标转换
ScreenToClient (hwnd, &pt);
ClientToScreen (hwnd, &pt);
until 命中测试消息