WindowsAPI程序设计补充教案第1页补充教案二1.调试程序的方法一DWORDGetLastError(VOID)使用:DWORDdw;调用某一个函数;dw=GetLasstError();根据dw的值可以知道上一个函数是否调用成功,或者是出了什么错误。2.关于滚动条的函数①设置滚动范围BOOLSetScrollRange(HWNDhWnd,//handletowindowwithscrollbarintnBar,//scrollbarflagintnMinPos,//minimumscrollingpositionintnMaxPos,//maximumscrollingpositionBOOLbRedraw//redrawflag);②获得滚动块的当前位置intGetScrollPos(HWNDhWnd,//handletowindowwithscrollbarintnBar//scrollbarflags);③设定滚动块的位置intSetScrollPos(HWNDhWnd,//handletowindowwithscrollbarintnBar,//scrollbarflagintnPos,//newpositionofscrollboxBOOLbRedraw//redrawflag);3.滚动条信息结构typedefstructtagSCROLLINFO{//siUINTcbSize;//结构体自身的大小UINTfMask;//操作标识intnMin;//滚动条范围最小值intnMax;//滚动条范围最大值WindowsAPI程序设计补充教案第2页UINTnPage;//页面大小intnPos;//滚动块位置intnTrackPos;//被拖动的滚动块位置}SCROLLINFO;typedefSCROLLINFOFAR*LPSCROLLINFOfMask的值可以取以下的值:SIF_ALLCombinationofSIF_PAGE,SIF_POS,SIF_RANGE,andSIF_TRACKPOS.SIF_DISABLENOSCROLLThisvalueisusedonlywhensettingascrollbar'sparameters.Ifthescrollbar'snewparametersmakethescrollbarunnecessary,disablethescrollbarinsteadofremovingit.SIF_PAGEThenPagemembercontainsthepagesizeforaproportionalscrollbar.SIF_POSThenPosmembercontainsthescrollboxposition,whichisnotupdatedwhiletheuserdragsthescrollbox.SIF_RANGEThenMinandnMaxmemberscontaintheminimumandmaximumvaluesforthescrollingrange.SIF_TRACKPOSThenTrackPosmembercontainsthecurrentpositionofthescrollboxwhiletheuseris4.新滚动条函数①设置函数intSetScrollInfo(HWNDhwnd,//handletowindowwithscrollbarintfnBar,//scrollbarflagLPSCROLLINFOlpsi,//pointertostructurewithscrollparametersBOOLfRedraw//redrawflag);其中fnBar的值可以取以下的值:WindowsAPI程序设计补充教案第3页SB_CTLSetstheparametersofascrollbarcontrol.Thehwndparametermustbethehandletothescrollbarcontrol.SB_HORZSetstheparametersofthegivenwindow'sstandardhorizontalscrollbar.SB_VERTSetstheparametersofthegivenwindow'sstandardverticalscrollbar.②获得滚动条信息函数BOOLGetScrollInfo(HWNDhwnd,//handletowindowwithscrollbarintfnBar,//scrollbarflagLPSCROLLINFOlpsi//pointertostructureforscrollparameters);5.改善滚动条①新的滚动条函数使用真正的32位参数,使得可以接收的滚动条变动范围扩大了。老的滚动条函数接收到带有SB_THUMBTRACK或SB_THUMBPOSITION信息的滚动条消息时,其参数wParam虽然是32位的,但因wParam高端的16位用于确定信息种类,所以只有低端的16位能够提供滚动块位置信息。②涉及滚动块的大小。老的滚动条程序中的滚动块大小是固定的。然而在通常的Windows应用程序中,滚动块的大小应当与应用程序窗口用户区的大小以及所需显示内容大小有关。6.滚动条消息①WM_VSCROLL其中LOWORD(wParam)可以表示所进行的操作SB_LINEUPSB_LINEDOWNSB_PAGEUPSB_PAGEDOWNSB_THUMBPOSITIONSB_SB_THUMBTRACKSB_TOPSB_BOTTOM②WM_HSCROLLSB_LINELEFTWindowsAPI程序设计补充教案第4页SB_LINERIGHTSB_PAGELEFTSB_PAGERIGHTSB_THUMBPOSITIONSB_THUMBTRACKSB_LEFTSB_RIGHT7.逻辑字体①LOGFONTtypedefstructtagLOGFONT{//lfLONGlfHeight;//设定字符高度LONGlfWidth;//设定平均字符宽度LONGlfEscapement;//连续字符水平方向逆时针旋转角度值×10LONGlfOrientation;//单个字符水平方向逆时针旋转角度值×10LONGlfWeight;//字符的粗细BYTElfItalic;//是否斜体BYTElfUnderline;//是否带下划线BYTElfStrikeOut;//是否字体上有横线BYTElfCharSet;//指定所属字符集BYTElfOutPrecision;//输出精度BYTElfClipPrecision;//制定如何裁剪位于裁剪区之外的字符BYTElfQuality;//指定匹配程度BYTElfPitchAndFamily;//定义字符间距TCHARlfFaceName[LF_FACESIZE];//字样名}LOGFONT;②创建字体函数1HFONTCreateFontIndirect(CONSTLOGFONT*lplf//pointertologicalfontstructure);③创建字体函数2HFONTCreateFont(intnHeight,//logicalheightoffontintnWidth,//logicalaveragecharacterwidthintnEscapement,//angleofescapementintnOrientation,//base-lineorientationangleintfnWeight,//fontweightDWORDfdwItalic,//italicattributeflagWindowsAPI程序设计补充教案第5页DWORDfdwUnderline,//underlineattributeflagDWORDfdwStrikeOut,//strikeoutattributeflagDWORDfdwCharSet,//charactersetidentifierDWORDfdwOutputPrecision,//outputprecisionDWORDfdwClipPrecision,//clippingprecisionDWORDfdwQuality,//outputqualityDWORDfdwPitchAndFamily,//pitchandfamilyLPCTSTRlpszFace//pointertotypefacenamestring);④使用逻辑字体的过程设置LOGFONT结构变量成员的值,通过调用CreateFontIndirect函数(也可以用CreateFont函数)来创建逻辑字体,该函数将返回一个HFONT类型的逻辑字体句柄;调用SelectObject函数将创建的逻辑字体选入设备描述表中,Windows会自动选择与之最匹配的物理字体;调用DeleteObject函数删除不再使用的逻辑字体。WindowsAPI程序设计补充教案第6页第四章图形显示一设备描述表设备描述表,简称DC,是GDI内部保存的数据结构。设备描述表与特定的显示设备相关。对于显示器,DC总是与显示器上特定的窗口相关。DC中保存了显示图形所需使用的各种参数值。⒈获取DC句柄方法一:HDChdc;PAINTSTRUCTps;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函数:intGetDeviceCaps(HDChdc,//handletothedevicecontextintnIndex//indexofcapabilitytoquery);WindowsAPI程序设计补充教案第7页通过该函数可以获取指定设备的信息。如:iValue=GetDeviceCaps(hdc,HORZRES);可得到设备的宽度(单位为像素)。⒊DC属性Windows使用DC来保存GDI函数如何在显示设备上工作的“当前属性”。当应用程序使用GetDC或BeginPaint函数获得一个设备描述表句柄时,Windows用默认值设置其所有的属性。应用程序可以通过相应的GDI函数调用获取、修改所有的属性值。常用的设备描述表属性见书表4—1。⒋保存设备描述表方法一:在注册窗口时,在窗口风格中添加CS_OWNDC标志。即:wndclass.style=CS_HREDRAW|CS_VREDRAW|CS_OWNDC;方法二:iSavedDC=SaveDc(hdc);……RestoreDC(hdc,iSavedDC);二设备坐标系和逻辑坐标系⒈抽象显示设备第一种抽象显示设备是用户区对象,就是窗口用户区。其坐标原点在用户区的左上角。可以通过调用GetDC或BeginPaint函数得到标识窗口用户区的DC句柄。当使用标识该区域的句柄作为GDI函数的参数时,GDI函数所使用的坐标值是相对于用户区坐标系的。第二种抽象显示设备是窗口对象,不仅包括用户区,还包括标题栏、菜单、滚动条和窗口框架等。定位该区域的坐标系称为窗口坐标系,其原点在整个窗口的左上角。可以使用GetWindowDC函数获得该设备对象的句柄。第三种抽象设备是整个屏幕对象。定位区域的设备坐标系称为屏幕坐标系,其坐标原点在整个屏幕的左上角。可以通过Creat