@illuz
2015-01-09T03:13:30.000000Z
字数 7206
阅读 2640
复习
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,否则是commitDWORD 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, // 消息IDWPARAM wParam, // 两个消息参数LPARAM lParam);
使用switch和case结构来确定窗口函数接收的消息并处理它 。
LoadIcon函数
HICON WINAPI LoadIcon( // 返回的指向图标的指针,如果失败,返回NULLHINSTANCE hInstance, // 用户定义图标在哪个实例中, NULL为系统图标LPCSTR lpIconName // 图标名,也称图标上的标签);
LoadImage()函数
HANDLE WINAPI LoadImage( // 图标的指针HINSTANCE hInstance,LPCTSTR lpszName, // 前两项与LoadIcon一样UNIT uType, // 图标格式,如IMAGE_BITMAP,IMAGE_CURSOR,IMAGE_ICONint 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, // 同SetScrollRangeint iBar, // 同SetScrollRangeint iPos, // 设定的滚动条的新的位置BOOL bRedraw); // 同SetScrollRange
获取滚动条的信息: GetScrollRange和GetScrollPos函数
使用ScrollInfo结构体
SetScrollInfo+GetScrollInfo函数
int SetScrollInfo(HWND hWnd, // 同SetScrollRangeint fnBar, // 同SetScrollRangeLPSCROLLINFO 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 命中测试消息