Windows Api补充教案二由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“windowsapi文档”。
Windows API程序设计
补充教案
补充教案二
1.调试程序的方法一
DWORD GetLastError(VOID)使用:DWORD dw;
调用某一个函数;
dw=GetLatError();根据dw的值可以知道上一个函数是否调用成功,或者是出了什么错误。
2.关于滚动条的函数 ① 设置滚动范围
BOOL SetScrollRange(HWND hWnd, // handle to window with scroll bar int nBar, // scroll bar flag int nMinPos, // minimum scrolling position int nMaxPos, // maximum scrolling position BOOL bRedraw // redraw flag);
② 获得滚动块的当前位置
int GetScrollPos(HWND hWnd, // handle to window with scroll bar int nBar // scroll bar flags);
③ 设定滚动块的位置
int SetScrollPos(HWND hWnd, // handle to window with scroll bar int nBar, // scroll bar flag int nPos, // new position of scroll box BOOL bRedraw // redraw flag);
3.滚动条信息结构
typedef struct tagSCROLLINFO { // si UINT cbSize;//结构体自身的大小 UINT fMask;//操作标识 int nMin;//滚动条范围最小值 int nMax;//滚动条范围最大值
第 1 页 Windows API程序设计
补充教案
UINT nPage;//页面大小 int nPos;//滚动块位置
int nTrackPos;//被拖动的滚动块位置 } SCROLLINFO;typedef SCROLLINFO FAR *LPSCROLLINFO fMask的值可以取以下的值:
SIF_ALL
Combination of SIF_PAGE, SIF_POS, SIF_RANGE, and SIF_TRACKPOS.SIF_DISABLENOSCROLL This value is used only when setting a
scroll bar's parameters.If the scroll bar's new parameters make the scroll bar unneceary, disable the scroll bar instead of removing it.SIF_PAGE SIF_POS
The nPage member contains the page size for a proportional scroll bar.The nPos member contains the scroll box position, which is not updated while the user drags the scroll box.The nMin and nMax members contain the minimum and maximum values for the scrolling range.The nTrackPos member contains the current position of the scroll box while the user is SIF_RANGE
SIF_TRACKPOS
4.新滚动条函数 ① 设置函数
int SetScrollInfo(HWND hwnd, // handle to window with scroll bar int fnBar, // scroll bar flag LPSCROLLINFO lpsi,// pointer to structure with scroll parameters BOOL fRedraw // redraw flag);
其中fnBar的值可以取以下的值:
第 2 页 Windows API程序设计
补充教案
SB_CTL Sets the parameters of a scroll bar control.The hwnd parameter must be the handle to the scroll bar control.SB_HORZ Sets the parameters of the given window's standard horizontal scroll bar.SB_VERT Sets the parameters of the given window's standard vertical scroll bar.② 获得滚动条信息函数
BOOL GetScrollInfo(HWND hwnd, // handle to window with scroll bar int fnBar, // scroll bar flag LPSCROLLINFO lpsi // pointer to structure for scroll parameters);
5.改善滚动条
① 新的滚动条函数使用真正的32位参数,使得可以接收的滚动条变动范围扩大了。老的滚动条函数接收到带有SB_THUMBTRACK或SB_THUMBPOSITION信息的滚动条消息时,其参数wParam虽然是32位的,但因wParam高端的16位用于确定信息种类,所以只有低端的16位能够提供滚动块位置信息。
② 涉及滚动块的大小。老的滚动条程序中的滚动块大小是固定的。然而在通常的Windows应用程序中,滚动块的大小应当与应用程序窗口用户区的大小以及所需显示内容大小有关。6.滚动条消息 ① WM_VSCROLL 其中LOWORD(wParam)可以表示所进行的操作 SB_LINEUP SB_LINEDOWN SB_PAGEUP SB_PAGEDOWN SB_THUMBPOSITION SB_SB_THUMBTRACK SB_TOP SB_BOTTOM ② WM_HSCROLL SB_LINELEFT
第 3 页 Windows API程序设计
补充教案
SB_LINERIGHT SB_PAGELEFT SB_PAGERIGHT SB_THUMBPOSITION SB_THUMBTRACK SB_LEFT SB_RIGHT 7.逻辑字体 ① LOGFONT typedef struct tagLOGFONT { // lf LONG lfHeight;//设定字符高度 LONG lfWidth;//设定平均字符宽度
LONG lfEscapement;//连续字符水平方向逆时针旋转角度值×10 LONG lfOrientation;//单个字符水平方向逆时针旋转角度值×10 LONG lfWeight;//字符的粗细 BYTE lfItalic;//是否斜体 BYTE lfUnderline;// 是否带下划线 BYTE lfStrikeOut;//是否字体上有横线 BYTE lfCharSet;//指定所属字符集 BYTE lfOutPrecision;//输出精度
BYTE lfClipPrecision;//制定如何裁剪位于裁剪区之外的字符 BYTE lfQuality;//指定匹配程度 BYTE lfPitchAndFamily;//定义字符间距 TCHAR lfFaceName[LF_FACESIZE];//字样名 } LOGFONT;② 创建字体函数1 HFONT CreateFontIndirect(CONST LOGFONT *lplf // pointer to logical font structure);
③ 创建字体函数2 HFONT CreateFont(int nHeight, // logical height of font int nWidth, // logical average character width int nEscapement, // angle of escapement int nOrientation, // base-line orientation angle int fnWeight, // font weight DWORD fdwItalic, // italic attribute flag
第 4 页 Windows API程序设计
补充教案
DWORD fdwUnderline, // underline attribute flag DWORD fdwStrikeOut, // strikeout attribute flag DWORD fdwCharSet, // character set identifier DWORD fdwOutputPrecision, // output precision DWORD fdwClipPrecision, // clipping precision DWORD fdwQuality, // output quality DWORD fdwPitchAndFamily, // pitch and family LPCTSTR lpszFace // pointer to typeface name string);
④ 使用逻辑字体的过程
设置LOGFONT结构变量成员的值,通过调用CreateFontIndirect函数(也可以用CreateFont函数)来创建逻辑字体,该函数将返回一个HFONT类型的逻辑字体句柄; 调用SelectObject函数将创建的逻辑字体选入设备描述表中,Windows会自动选择与之最匹配的物理字体; 调用DeleteObject函数删除不再使用的逻辑字体。
第 5 页 Windows API程序设计
补充教案
第四章
图形显示
一
设备描述表
设备描述表,简称DC,是GDI内部保存的数据结构。设备描述表与特定的显示设备相关。对于显示器,DC总是与显示器上特定的窗口相关。DC中保存了显示图形所需使用的各种参数值。
⒈ 获取DC句柄
方法一: HDC hdc;PAINTSTRUCT ps;hdc=BeginPaint(hwnd,&ps);„„
EndPaint(hwnd,&ps);方法二:
hdc=GetDC(hwnd);„„
ReleaseDC(hwnd,hdc);方法三:
hdc=GetWindowDC(hwnd);„„
ReleaseDC(hwnd,hdc);方法四:
hdc=CreateDC(TEXT(“DISPLAY”),NULL,NULL,NULL);通过方法四可以获取整个屏幕的DC句柄。特例一:
有时用户只是需要获取关于DC的一些信息而并不进行任何绘画,这时,可以使用CreateIC来获取一个“信息描述表”的句柄,其参数与CreateDC函数相同,如:
hdc=CreateIC(TEXT(“DISPLAY”),NULL,NULL,NULL);⒉ 获取DC信息
GetDeviceCaps函数:
int GetDeviceCaps(HDC hdc, // handle to the device context int nIndex // index of capability to query);
第 6 页 Windows API程序设计
补充教案
通过该函数可以获取指定设备的信息。如: iValue=GetDeviceCaps(hdc,HORZRES);可得到设备的宽度(单位为像素)。
⒊ DC属性
Windows使用DC来保存GDI函数如何在显示设备上工作的“当前属性”。当应用程序使用GetDC或BeginPaint函数获得一个设备描述表句柄时,Windows用默认值设置其所有的属性。应用程序可以通过相应的GDI函数调用获取、修改所有的属性值。
常用的设备描述表属性见书表4—1。
⒋ 保存设备描述表
方法一:
在注册窗口时,在窗口风格中添加CS_OWNDC标志。即:
wndcla.style=CS_HREDRAW|CS_VREDRAW|CS_OWNDC;方法二:
iSavedDC=SaveDc(hdc);„„
RestoreDC(hdc,iSavedDC);二
设备坐标系和逻辑坐标系
⒈ 抽象显示设备
第一种抽象显示设备是用户区对象,就是窗口用户区。其坐标原点在用户区的左上角。可以通过调用GetDC或BeginPaint函数得到标识窗口用户区的DC句柄。当使用标识该区域的句柄作为GDI函数的参数时,GDI函数所使用的坐标值是相对于用户区坐标系的。
第二种抽象显示设备是窗口对象,不仅包括用户区,还包括标题栏、菜单、滚动条和窗口框架等。定位该区域的坐标系称为窗口坐标系,其原点在整个窗口的左上角。可以使用GetWindowDC函数获得该设备对象的句柄。
第三种抽象设备是整个屏幕对象。定位区域的设备坐标系称为屏幕坐标系,其坐标原点在整个屏幕的左上角。可以通过CreateDC函数来获得。
HDC CreateDC(LPCTSTR lpszDriver, // pointer to string specifying driver name LPCTSTR lpszDevice, // pointer to string specifying device name LPCTSTR lpszOutput, // do not use;set to NULL CONST DEVMODE *lpInitData
// pointer to optional printer data);
第 7 页 Windows API程序设计
补充教案
例程如下:
LRESULT CALLBACK WndProc(HWND hwnd, UINT meage, WPARAM wParam, LPARAM lParam){ HDC
hdc;TCHAR TextInClientRect[] = TEXT(“客户区左上角!”);TCHAR TextInWindow[] = TEXT(“窗口左上角!”);TCHAR TextInScreen[] = TEXT(“屏幕左上角!”);switch(meage){ case WM_CREATE:
return 0;
case WM_PAINT:
hdc = GetDC(hwnd);
TextOut(hdc, 0, 0, TextInClientRect, strlen(TextInClientRect));
ValidateRect(hwnd, NULL);
ReleaseDC(hwnd, hdc);
hdc = GetWindowDC(hwnd);
TextOut(hdc, 0, 0, TextInWindow, strlen(TextInWindow));
//ValidateRect(hwnd, NULL);
ReleaseDC(hwnd, hdc);
hdc = CreateDC(“Display”, NULL, NULL, NULL);
TextOut(hdc, 0, 0, TextInScreen, strlen(TextInScreen));
//ValidateRect(hwnd, NULL);
DeleteDC(hdc);
return 0;
case WM_DESTROY:
PostQuitMeage(0);
return 0;}
return DefWindowProc(hwnd, meage, wParam, lParam);}
第 8 页 Windows API程序设计
补充教案
⒉ 逻辑坐标系
逻辑坐标系使得用户和程序员可以按已习惯使用的尺寸来描述显示对象或显示图形。应用程序使用逻辑坐标系中的坐标值,而由Windows根据不同的映射模式将逻辑坐标系中的坐标值转换成设备坐标系中的坐标值。映射模式同时也决定着逻辑坐标值的单位和逻辑坐标轴的正方向。
①
ClientToScreen BOOL ClientToScreen(HWND hWnd, // window handle for source coordinates LPPOINT lpPoint // pointer to structure containing screen coordinates);
②
ScreenToClient BOOL ScreenToClient(HWND hWnd, // window handle for source coordinates LPPOINT lpPoint // addre of structure containing coordinates);
三
映射模式
映射模式是影响几乎所有用户区的一个很重要的DC属性。映射模式定义了Windows如何将GDI函数中所使用的逻辑坐标映射为设备坐标。其他4个设备DC属性(窗口原点、窗口范围、视图原点和视图范围)都与映射模式密切相关。当Windows将逻辑坐标转换为设备单位或者像素的时候,映射模式、窗口原点和视图原点、窗口范围和视图范围决定着这种转换。映射模式也隐含了X轴、Y轴的原点和正方向。
⒈ 窗口和视图
① 视图
视图是视频显示器屏幕上的一块显示区域。相应于在GDI中所使用的设备描述表句柄的不同,该区域可以是用户区、全窗口区或者是整个屏幕区,视图中的图形使用设备单位。
② 窗口
与视图中显示的图形相对应的原始图形区域称为窗口。
需要注意的是,这里的术语“窗口”不是通常意义上所指的、在屏幕上显示的可视窗口对象,而是指从真实世界的角度所看到的图形;相应地,“视图”是从数据世界角度而言的,是由屏幕上的像素形成的图形。在Windows中,视图不是一个裁剪区域。
第 9 页 Windows API程序设计
补充教案
映射模式是指从“窗口”(逻辑坐标)到“视图”(设备坐标)的转换。“窗口”使用逻辑坐标,其单位可以是像素、毫米、英寸或者任意其他单位。“视图”使用设备坐标,以像素为单位。大多数GDI函数使用逻辑坐标。
③ 转换公式
◆ 从窗口坐标转化为视口坐标:
xViewExtxViewport(xWindowxWinOrg)xViewOrg
xWinExtyViewport(yWindowyWinOrg)yViewExtyViewOrg
yWinExt其中,(xWindow,yWindow)是待转换的逻辑点;(xViewport,yViewport)是转换后的设备坐标点,更像客户区坐标;(xWinOrg,yWinOrg)是逻辑坐标的窗口原点;(xViewOrg,yViewOrg)是设备坐标的视口原点。在默认的设备描述表中,这两个点均被设置为(0,0),但是它们可以改变。这表明,逻辑点(xWinOrg,yWinOrg)总被映射为设备点(xViewOrg,yViewOrg)。如果窗口和视口的原点是默认值(0,0),则公式简化为:
xViewExtxViewportxWindow
xWinExtyViewportyWindowyViewExt
yWinExt在上述公式中,(xWinExt,yWinExt)是逻辑坐标的窗口范围;(xViewExt,yViewExt)是设备坐标的窗口范围。在多数映射方式中,范围是映射方式所隐含的,不能够改变。每个范围自身没有什么意义,但是视口范围与窗口范围的比是逻辑单位转换为设备单位的换算因子。
例如,当用户设置MM_LOENGLISH映射方式时,Windows将xViewExt设置为某个像素而将xWinExt设置为xViewExt像素占据的一英寸内有几百像素的长度。比值给出了一英寸内有几百个像素的数值。
注意:范围可以为负,逻辑x轴上的不一定非得在向右时增加;逻辑y轴上的值不一定非得在向下时增加。
◆ 从视口坐标转换为窗口坐标
xWinExtxWindow(xViewportxViewOrg)xWinOrg
xViewExt
第 10 页 Windows API程序设计
补充教案
yWindow(yViewportyViewOrg)yWinExtyWinOrg
yViewExt④ DPtoLP函数
BOOL DPtoLP(HDC hdc, // handle to device context LPPOINT lpPoints, // pointer to array of points int nCount // count of points);
⑤ LPtoDP函数
BOOL LPtoDP(HDC hdc, // handle of device context LPPOINT lpPoints, // array of points int nCount // count of points);⑥ ClientToScreen函数
BOOL ClientToScreen(HWND hWnd, // window handle for source coordinates LPPOINT lpPoint // pointer to structure containing screen
coordinates);
⑦ ScreenToClient函数
BOOL ScreenToClient(HWND hWnd, // window handle for source coordinates LPPOINT lpPoint // addre of structure containing);coordinates ⒉ 映射方式种类和相关函数 ① 种类
映射方式
MM_TEXT MM_LOMETRIC MM_HIMETRIC MM_LOENGLISH MM_HIENGLISH
逻辑单位
像素 0.1mm 0.01mm 0.01in.0.001in.增 加 值 x值
右 右 右 右 右
y值
下 上 上 上 上
第 11 页 Windows API程序设计
补充教案
MM_TWIPS 1/1440 in.MM_ISOTROPIC 任意(x=y)MM_ANISOTROPIC 任意(x!=y)右 可选 可选 上 可选 可选
默认映射方式为MM_TEXT ②函数
SetMapMode函数
int SetMapMode(HDC hdc, // handle of device context int fnMapMode // new mapping mode);
GetMapMode函数
int GetMapMode(HDC hdc // handle of device context);
注意:虽然在GDI函数中指定的坐标是32位的值,但是仅有Windows NT 能够处理全32位。在Windows 98中,坐标被限制为16位,范围从-32768到32767。
⒊ 视图和窗口原点函数 ① SetViewportOrgEx函数
BOOL SetViewportOrgEx(HDC hdc, // handle of device context int X, // new x-coordinate of viewport origin int Y, // new y-coordinate of viewport origin LPPOINT lpPoint);// addre of structure receiving original origin 说明:用于改变视口的原点。② SetWindowOrgEx函数
BOOL SetWindowOrgEx(HDC hdc, // handle of device context int X, // new x-coordinate of window origin int Y, // new y-coordinate of window origin LPPOINT lpPoint);// addre of structure receiving original origin 说明:用于改变窗口的原点。
如果将视口原点改变为(xViewOrg,yViewOrg),则逻辑点
第 12 页 Windows API程序设计
补充教案
(0,0)就会映射为设备点(xViewOrg,yViewOrg)。如果将窗口原点改变为(xWinOrg,yWinOrg),则逻辑点(xWinOrg,yWinOrg)将会映射为设备点(0,0)。
例如,假设客户区为cxClient个像素宽和cyClient个像素高。如果将逻辑点(0,0)定义为客户区的中心,则进行如下调用:
SetViewportOrgEx(hdc,cxClient/2,cyClient/2,NULL);则客户区的坐标系变成如下形状:
这时在客户区的左上角开始显示文本,需进行如下调用: TextOut(hdc,-cxClient/2,-cyClient/2,”HELLO”,5);
用以下调用代替上述调用:(效果相同)
SetWindowOrgEx(hdc,-cxClient/2,-cyClient/2,NULL)TextOut(hdc,-cxClient/2,-cyClient/2,”HELLO”,5);
第 13 页