Windows Api教案2_windowsapi实例

教案模板 时间:2020-02-27 17:51:36 收藏本文下载本文
【www.daodoc.com - 教案模板】

Windows Api教案2由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“windowsapi实例”。

教 案 用 纸 第三章 输出文本

一 绘制和刷新

Windows通过发送WM_PAINT消息通知窗口过程,窗口的部分客户区需要绘制。

⒈ WM_PAINT消息

Windows利用该消息是来重新绘制屏幕的。

产生该消息的情况有以下几种:

◆ UpdateWindow执行时;

◆ 在用户移动窗口或显示窗口时,窗口中先前被隐藏的区域重新可见;

◆ 用户改变窗口的大小(具备CS_HREDRAW和CS_VREDRAW);

◆ 程序使用ScrollWindow或ScrollDC函数滚动客户区的一部分; ◆ 程序使用InvalidateRect或InvalidateRgn函数显示产生WM_PAINT消息;

在某些情况下,客户区的一部分被临时覆盖,Windows试图保存一个显示区域,并在以后恢复它,但这并不总是成功的。下面的情况下,Windows可能发送WM_PAINT消息:

◆ Windows擦除覆盖了部分窗口的对话框或消息框;

◆ 菜单下拉出来,然后被释放; ◆ 显示工具提示。

在某些情况下,Windows总是保存它所覆盖的显示区域,然后恢复它。这些情况是: ◆ 鼠标光标穿越客户区; ◆

图标拖过客户区; ◆

可以用SendMeage函数发送WM_PAINT消息。

⒉ 有效矩形和无效矩形 ① 无效区域

窗口的部分或全部客户区被其它窗口覆盖时,当其它窗口擦除后,被覆盖的区域称为“无效区域”或“更新区域”。② 无效矩形

Windows内部为每个窗口保存一个“绘图信息结构”,这个结构包含了包围无效区域的最小矩形的坐标以及其它信息,这个矩形称为“无效矩形”。说明:如果在窗口过程处理WM_PAINT消息之前客户区中的另一个新的区域变为无效,则Windows计算出一个包围两个区域的新的无效区域,并将这种变化后的信息放在绘制信息结构中。Windows不会将多个WM_PAINT消息都放在消息队列中。

③ GetUpdateRect函数

通过该函数可以在任何时候获取无效矩形的坐标。

吉 林 化 工 学 院 第 19 页 教 案 用 纸

④ 处理WM_PAINT消息

在处理WM_PAINT消息期间,窗口过程在调用了BeginPaint之后,整个客户区即变为有效。也可通过调用ValidateRect函数使客户区内的任意矩形区域变为有效。如果这条调用具有令整个无效区域变为有效的效果,则当前队列中的任意WM_PAINT消息都将被删除。二 GDI简介

⒈ TextOut函数

BOOL TextOut(HDC hdc, // handle to device context int nXStart, // x-coordinate of starting position int nYStart, // y-coordinate of starting position LPCTSTR lpString, // pointer to string int cbString // number of characters in string);注意:参数nXStart,nYStart为逻辑坐标;

参数lpString不能显示任何ASCII控制字符,也不能识别作为串尾标志的内容为零的字节; ⒉ 设备描述表

设备描述表(简称DC)实际上是GDI内部保存的数据结构。设备描述表与特定的显示设备相关。设备描述表中的有些值是图形化的“属性”,这些属性定义了一些GDI绘图函数工作情况的特殊内容。

例如,对于TextOut,设备描述表的属性确定了文本的颜色、文本的背景色、TextOut函数的x坐标和y坐标映射到窗口的客户区的方式,以及显示文本时,Windows使用的字体。

当程序需要绘图时,它必须先获取设备描述表句柄。在获取了该句柄后,Windows用默认的属性值填充内部设备描述表结构。这些属性值可以在程序中被GDI函数修改,也可被得到。

当程序在客户区绘图完毕后,它必须释放设备描述表句柄。除了用CreateDC创建的设备描述表之外,程序不能在两个消息之间保存其他设备描述表句柄。

⒊ 获取设备描述表句柄:方法一 PAINTSTRUCT ps;HDC hdc;„„„„

case WM_PAINT: hdc=BeginPaint(hwnd,&ps);„„„

吉 林 化 工 学 院 第 20 页 教 案 用 纸

EndPaint(hwnd,&ps);return 0;错误过程:

case WM_PAINT: return 0;将导致死循环。

⒋ 绘图信息结构

typedef struct tagPAINTSTRUCT { HDC hdc;BOOL fErase;RECT rcPaint;BOOL fRestore;BOOL fIncUpdate;BYTE rgbReserved[16];} PAINTSTRUCT;在程序调用BeginPaint时,Windows填充该结构的各个字段。用户程序只使用前三个字段,其他字段由Windows内部使用。

说明:hdc指明用来绘制的设备描述表;

fErase指明背景是否被重新绘制,FALSE绘制,TRUE不绘制; rcPaint指明重新绘制的矩形区域,即无效区域。

⒌ InvalidateRect函数

BOOL InvalidateRect(HWND hWnd, // handle of window with changed update region CONST RECT *lpRect, // addre of rectangle coordinates BOOL bErase // erase-background flag);例如,InvalidateRect(hwnd,NULL,TRUE);它使整个客户区变为无效,并擦除背景。

⒍ 获取设备描述表句柄:方法二 hdc=GetDC(hwnd);„„„„

ReleaseDC(hwnd,hdc);说明:与从BeginPaint返回设备描述表句柄不同,GetDC返回的设备描述表句柄具有一个剪取矩形,它等于整个客户区。可以在客户区的某一部分绘图,而不只是在无效矩形上绘图。与BegingPaint不同,GetDC不会使任何无效区域变为有效。⒎ ValidateRect函数

吉 林 化 工 学 院 第 21 页 教 案 用 纸

BOOL ValidateRect(HWND hWnd, // handle of window CONST RECT *lpRect // addre of validation rectangle coordinates);例如,ValidateRect(hwnd,NULL);它使整个客户区变为有效。⒏ GetWindowDC函数

HDC GetWindowDC(HWND hWnd // handle of window);用来获得整个窗口的设备描述表。而GetDC用来获得客户区的设备描述表。⒐ 系统字体

系统字体为Windows98下的字体,作为TextOut函数使用的默认字体,该字体为变宽字体(variable-pitch),也是点阵字体。

⒑ 字符大小 ① TEXTMETRIC typedef struct tagTEXTMETRIC { // tm LONG tmHeight;LONG tmAscent;LONG tmDescent;LONG tmInternalLeading;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;BYTE tmCharSet;} TEXTMETRIC;吉 林 化 工 学 院 第 22 页 教 案 用 纸

说明:tmHeight字符的高度; tmAscent 字符的重音高度 tmDescent 字符的下降高度

tmInternalLeading 字符的内部间距 tmExternalLeading 字符的外部间距 tmAveCharWidth 字符的小写平均宽度 tmMaxCharWidth 字符的最大宽度 tmWeight 字符的宽度 ② GetTextMetrics函数

BOOL GetTextMetrics(HDC hdc, // handle to device context LPTEXTMETRIC lptm // pointer to text metrics structure);例如:

TEXTMETRIC tm;„„„

hdc=GetDC(hwnd);GetTextMetrics(hdc,&tm);ReleaseDC(hwnd,hdc);„„„„

⒒ 格式化文本

① WM_CREATE时使用GetTextMetrics函数 Static cxChar,cyChar;

case WM_CREATE: hdc=GetDC(hwnd);GetTextMetrics(hdc,&tm);cxChar=tm.tmAveCharWidth;cyChar=tm.tmHeight+tm.tmExternalLeading;ReleaseDC(hwnd,hdc);return 0;② 使用wsprintf来格式化文本 int iLength;TCHAR szBuffer[40];

iLength=wsprintf(szBuffer,TEXT(“The sum of %i and %i is %i”),iA,iB,iA+iB);吉 林 化 工 学 院 第 23 页 教 案 用 纸

TextOut(hdc,x,y,szBuffer,iLength);⒓ 综合应用 ① SYSMETS.H #define NUMLINES((int)(sizeof sysmetrics / sizeof sysmetrics [0]))

struct { int iIndex;TCHAR * szLabel;TCHAR * szDesc;} sysmetrics [] = { SM_CXSCREEN, TEXT(“SM_CXSCREEN”), TEXT(“Screen width in pixels”), SM_CYSCREEN, TEXT(“SM_CYSCREEN”), TEXT(“Screen height in pixels”), SM_CXVSCROLL, TEXT(“SM_CXVSCROLL”), TEXT(“Vertical scroll width”), SM_CYHSCROLL, TEXT(“SM_CYHSCROLL”), TEXT(“Horizontal scroll height”), SM_CYCAPTION, TEXT(“SM_CYCAPTION”), TEXT(“Caption bar height”), SM_CXBORDER, TEXT(“SM_CXBORDER”), TEXT(“Window border width”), SM_CYBORDER, TEXT(“SM_CYBORDER”), TEXT(“Window border height”), SM_CXFIXEDFRAME, TEXT(“SM_CXFIXEDFRAME”), TEXT(“Dialog window frame width”), SM_CYFIXEDFRAME, TEXT(“SM_CYFIXEDFRAME”), TEXT(“Dialog window frame height”), SM_CYVTHUMB, TEXT(“SM_CYVTHUMB”), TEXT(“Vertical scroll thumb height”), SM_CXHTHUMB, TEXT(“SM_CXHTHUMB”), TEXT(“Horizontal scroll thumb width”), SM_CXICON, TEXT(“SM_CXICON”), TEXT(“Icon width”), SM_CYICON, TEXT(“SM_CYICON”), TEXT(“Icon height”), SM_CXCURSOR, TEXT(“SM_CXCURSOR”), TEXT(“Cursor width”), SM_CYCURSOR, TEXT(“SM_CYCURSOR”), 吉 林 化 工 学 院 第 24 页 教 案 用 纸

TEXT(“Cursor height”), SM_CYMENU, TEXT(“SM_CYMENU”), TEXT(“Menu bar height”), SM_CXFULLSCREEN, TEXT(“SM_CXFULLSCREEN”), TEXT(“Full screen client area width”), SM_CYFULLSCREEN, TEXT(“SM_CYFULLSCREEN”), TEXT(“Full screen client area height”), SM_CYKANJIWINDOW, TEXT(“SM_CYKANJIWINDOW”), TEXT(“Kanji window height”), SM_MOUSEPRESENT, TEXT(“SM_MOUSEPRESENT”), TEXT(“Mouse present flag”), SM_CYVSCROLL, TEXT(“SM_CYVSCROLL”), TEXT(“Vertical scroll arrow height”), SM_CXHSCROLL, TEXT(“SM_CXHSCROLL”), TEXT(“Horizontal scroll arrow width”), SM_DEBUG, TEXT(“SM_DEBUG”), TEXT(“Debug version flag”), SM_SWAPBUTTON, TEXT(“SM_SWAPBUTTON”), TEXT(“Mouse buttons swapped flag”), SM_CXMIN, TEXT(“SM_CXMIN”), TEXT(“Minimum window width”), SM_CYMIN, TEXT(“SM_CYMIN”), TEXT(“Minimum window height”), SM_CXSIZE, TEXT(“SM_CXSIZE”), TEXT(“Min/Max/Close button width”), SM_CYSIZE, TEXT(“SM_CYSIZE”), TEXT(“Min/Max/Close button height”), SM_CXSIZEFRAME, TEXT(“SM_CXSIZEFRAME”), TEXT(“Window sizing frame width”), SM_CYSIZEFRAME, TEXT(“SM_CYSIZEFRAME”), TEXT(“Window sizing frame height”), SM_CXMINTRACK, TEXT(“SM_CXMINTRACK”), TEXT(“Minimum window tracking width”), SM_CYMINTRACK, TEXT(“SM_CYMINTRACK”), TEXT(“Minimum window tracking height”), SM_CXDOUBLECLK, TEXT(“SM_CXDOUBLECLK”), TEXT(“Double click x tolerance”), SM_CYDOUBLECLK, TEXT(“SM_CYDOUBLECLK”), TEXT(“Double click y tolerance”), SM_CXICONSPACING, TEXT(“SM_CXICONSPACING”), TEXT(“Horizontal icon spacing”), SM_CYICONSPACING, TEXT(“SM_CYICONSPACING”), 吉 林 化 工 学 院 第 25 页 教 案 用 纸

TEXT(“Vertical icon spacing”), SM_MENUDROPALIGNMENT, TEXT(“SM_MENUDROPALIGNMENT”), TEXT(“Left or right menu drop”), SM_PENWINDOWS, TEXT(“SM_PENWINDOWS”), TEXT(“Pen extensions installed”), SM_DBCSENABLED, TEXT(“SM_DBCSENABLED”), TEXT(“Double-Byte Char Set enabled”), SM_CMOUSEBUTTONS, TEXT(“SM_CMOUSEBUTTONS”), TEXT(“Number of mouse buttons”), SM_SECURE, TEXT(“SM_SECURE”), TEXT(“Security present flag”), SM_CXEDGE, TEXT(“SM_CXEDGE”), TEXT(“3-D border width”), SM_CYEDGE, TEXT(“SM_CYEDGE”), TEXT(“3-D border height”), SM_CXMINSPACING, TEXT(“SM_CXMINSPACING”), TEXT(“Minimized window spacing width”), SM_CYMINSPACING, TEXT(“SM_CYMINSPACING”), TEXT(“Minimized window spacing height”), SM_CXSMICON, TEXT(“SM_CXSMICON”), TEXT(“Small icon width”), SM_CYSMICON, TEXT(“SM_CYSMICON”), TEXT(“Small icon height”), SM_CYSMCAPTION, TEXT(“SM_CYSMCAPTION”), TEXT(“Small caption height”), SM_CXSMSIZE, TEXT(“SM_CXSMSIZE”), TEXT(“Small caption button width”), SM_CYSMSIZE, TEXT(“SM_CYSMSIZE”), TEXT(“Small caption button height”), SM_CXMENUSIZE, TEXT(“SM_CXMENUSIZE”), TEXT(“Menu bar button width”), SM_CYMENUSIZE, TEXT(“SM_CYMENUSIZE”), TEXT(“Menu bar button height”), SM_ARRANGE, TEXT(“SM_ARRANGE”), TEXT(“How minimized windows arranged”), SM_CXMINIMIZED, TEXT(“SM_CXMINIMIZED”), TEXT(“Minimized window width”), SM_CYMINIMIZED, TEXT(“SM_CYMINIMIZED”), TEXT(“Minimized window height”), SM_CXMAXTRACK, TEXT(“SM_CXMAXTRACK”), TEXT(“Maximum draggable width”), SM_CYMAXTRACK, TEXT(“SM_CYMAXTRACK”), 吉 林 化 工 学 院 第 26 页 教 案 用 纸

TEXT(“Maximum draggable height”), SM_CXMAXIMIZED, TEXT(“SM_CXMAXIMIZED”), TEXT(“Width of maximized window”), SM_CYMAXIMIZED, TEXT(“SM_CYMAXIMIZED”), TEXT(“Height of maximized window”), SM_NETWORK, TEXT(“SM_NETWORK”), TEXT(“Network present flag”), SM_CLEANBOOT, TEXT(“SM_CLEANBOOT”), TEXT(“How system was booted”), SM_CXDRAG, TEXT(“SM_CXDRAG”), TEXT(“Avoid drag x tolerance”), SM_CYDRAG, TEXT(“SM_CYDRAG”), TEXT(“Avoid drag y tolerance”), SM_SHOWSOUNDS, TEXT(“SM_SHOWSOUNDS”), TEXT(“Present sounds visually”), SM_CXMENUCHECK, TEXT(“SM_CXMENUCHECK”), TEXT(“Menu check-mark width”), SM_CYMENUCHECK, TEXT(“SM_CYMENUCHECK”), TEXT(“Menu check-mark height”), SM_SLOWMACHINE, TEXT(“SM_SLOWMACHINE”), TEXT(“Slow proceor flag”), SM_MIDEASTENABLED, TEXT(“SM_MIDEASTENABLED”), TEXT(“Hebrew and Arabic enabled flag”), SM_MOUSEWHEELPRESENT, TEXT(“SM_MOUSEWHEELPRESENT”), TEXT(“Mouse wheel present flag”), SM_XVIRTUALSCREEN, TEXT(“SM_XVIRTUALSCREEN”), TEXT(“Virtual screen x origin”), SM_YVIRTUALSCREEN, TEXT(“SM_YVIRTUALSCREEN”), TEXT(“Virtual screen y origin”), SM_CXVIRTUALSCREEN, TEXT(“SM_CXVIRTUALSCREEN”), TEXT(“Virtual screen width”), SM_CYVIRTUALSCREEN, TEXT(“SM_CYVIRTUALSCREEN”), TEXT(“Virtual screen height”), SM_CMONITORS, TEXT(“SM_CMONITORS”), TEXT(“Number of monitors”), SM_SAMEDISPLAYFORMAT, TEXT(“SM_SAMEDISPLAYFORMAT”), TEXT(“Same color format flag”)};② SYSMETS1.C

#define WINVER 0x0500 #include #include “sysmets.h” 吉 林 化 工 学 院 第 27 页 教 案 用 纸

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){ static TCHAR szAppName[] = TEXT(“SysMets1”);HWND hwnd;MSG msg;WNDCLASS wndcla;wndcla.style = CS_HREDRAW | CS_VREDRAW;wndcla.lpfnWndProc = WndProc;wndcla.cbClsExtra = 0;wndcla.cbWndExtra = 0;wndcla.hInstance = hInstance;wndcla.hIcon = LoadIcon(NULL, IDI_APPLICATION);wndcla.hCursor = LoadCursor(NULL, IDC_ARROW);wndcla.hbrBackground =(HBRUSH)GetStockObject(WHITE_BRUSH);wndcla.lpszMenuName = NULL;wndcla.lpszClaName = szAppName;if(!RegisterCla(&wndcla)){ MeageBox(NULL, TEXT(“This program requires Windows NT!”), szAppName, MB_ICONERROR);return 0;} hwnd = CreateWindow(szAppName, TEXT(“Get System Metrics No.1”), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);ShowWindow(hwnd, iCmdShow);UpdateWindow(hwnd);while(GetMeage(&msg, NULL, 0, 0)){ TranslateMeage(&msg);DispatchMeage(&msg);} return msg.wParam;} LRESULT CALLBACK WndProc(HWND hwnd, UINT meage, WPARAM wParam, LPARAM lParam){

吉 林 化 工 学 院 第 28 页 教 案 用 纸

static int cxChar, cxCaps, cyChar;HDC hdc;int i;PAINTSTRUCT ps;TCHAR szBuffer [10];TEXTMETRIC tm;switch(meage){ case WM_CREATE: hdc = GetDC(hwnd);GetTextMetrics(hdc, &tm);cxChar = tm.tmAveCharWidth;cxCaps =(tm.tmPitchAndFamily & 1 ? 3 : 2)* cxChar / 2;cyChar = tm.tmHeight + tm.tmExternalLeading;ReleaseDC(hwnd, hdc);return 0;case WM_PAINT : hdc = BeginPaint(hwnd, &ps);for(i = 0;i

例如:GetSystemMetrics(SM_CXSCREEN);用来获得屏幕的x轴最大分辨率。

吉 林 化 工 学 院 第 30 页

下载Windows Api教案2word格式文档
下载Windows Api教案2.doc
将本文档下载到自己电脑,方便修改和收藏。
点此处下载文档

文档为doc格式

    热门文章
      整站推荐
        点击下载本文