日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

sdk笔记1

發(fā)布時間:2023/12/10 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sdk笔记1 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

第二章

cxScreen?=?GetSystemMetrics?(SM_CXSCREEN)?; ??//得到系統(tǒng)的硬件的某些參數(shù)

cyScreen?=?GetSystemMetrics?(SM_CYSCREEN)?;

RECT?rt;

GetClientRect(hWnd,?&rt); //得到客戶區(qū)矩形區(qū)

//sprintf(buf,"???%d",4); // 格式化輸出文本

wsprintf(buf,"???%d",6);

TextOut(hdc,10,10,buf,strlen(buf));

DrawText(hdc,?szHello,?strlen(szHello),?&rt,?DT_CENTER);

第三章

HICON?LoadIcon(HINSTANCE?hInstance,LPCTSTR?lpIconName);??加載圖標(biāo)

第一個參數(shù)值為NULL,則是設(shè)置系統(tǒng)默認(rèn)幾種類型的圖標(biāo)

Getlasterror可用于函數(shù)調(diào)用失敗時獲得拓展的錯誤信息。

WM_DESTROY消息

WM_DESTROY消息是另一個重要消息。這一個消息指示,Windows正在根據(jù)使用者的指示關(guān)閉窗口。該消息是使用者單擊Close按鈕或者在程序的系統(tǒng)菜單上選擇?Close時發(fā)生的(在本章的后面,我們將詳細(xì)討論WM_DESTROY消息是如何生效的)。

HELLOWIN通過呼叫PostQuitMessage以標(biāo)準(zhǔn)方式響應(yīng)WM_DESTROY消息:

PostQuitMessage?(0)?;

???????

該函數(shù)在程序的消息隊(duì)列中插入一個WM_QUIT消息。前面提到過,GetMessage對于除了WM_QUIT之外的從消息隊(duì)列中取出的所有消息都傳回非0值。而當(dāng)GetMessage得到一個WM_QUIT消息時,它傳回0。這將導(dǎo)致WinMain退出消息循環(huán),并終止程序。然后程序執(zhí)行下面的敘述:

return?msg.wParam?;

???????

結(jié)構(gòu)的wParam字段是傳遞給PostQuitMessage函數(shù)的值(通常是0)。然后return敘述將退出WinMain并終止程序。

第四章

程序使用InvalidateRectInvalidateRgn函數(shù)刻意產(chǎn)生WM_PAINT消息。

窗口消息處理程序可以通過呼叫InvalidateRect使顯示區(qū)域內(nèi)的矩形無效。如果消息隊(duì)列中已經(jīng)包含一個WM_PAINT消息,Windows將計(jì)算出新的無效矩形。否則,它將一個新的WM_PAINT消息放入消息隊(duì)列中。在接收到WM_PAINT消息時,窗口消息處理程序可以取得無效矩形的坐標(biāo)(我們馬上就會看到這一點(diǎn))。通過呼叫GetUpdateRect,可以在任何時候取得這些坐標(biāo)。

在處理WM_PAINT消息處理期間,窗口消息處理程序在呼叫了BeginPaint之后,整個顯示區(qū)域即變?yōu)橛行А3绦蛞部梢酝ㄟ^呼叫ValidateRect函數(shù)使顯示區(qū)域內(nèi)的任意矩形區(qū)域變?yōu)橛行АH绻@呼叫具有令整個無效區(qū)域變?yōu)橛行У男Ч?#xff0c;則目前隊(duì)列中的任何WM_PAINT消息都將被刪除。

wndclass.hbrBackground?=?(HBRUSH)?GetStockObject?(WHITE_BRUSH)?; 得到白色畫刷

要使用GetTextMetrics函數(shù),需要先定義一個結(jié)構(gòu)變量(通常稱為tm):

TEXTMETRIC?tm?;????

在需要確定文字大小時,先取得設(shè)備內(nèi)容句柄,再呼叫GetTextMetrics

hdc?=?GetDC?(hwnd)?;??????

GetTextMetrics?(hdc,?&tm)?;

ReleaseDC?(hwnd,?hdc)?;

???????

此后,您就可以查看文字尺寸結(jié)構(gòu)中的值,并有可能保存其中的一些以備將來使用。

下面是取得系統(tǒng)字體的字符寬度和高度的WM_CREATE程序代碼:

case?WM_CREATE:??

????hdc?=?GetDC?(hwnd)?;??

????GetTextMetrics?(hdc,?&tm)?;????

????cxChar?=?tm.tmAveCharWidth?;???

????cyChar?=?tm.tmHeight?+?tm.tmExternalLeading?;

ReleaseDC?(hwnd,?hdc)?;

????return?0?;

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)?;

?????UINT?SetTextAlign(?HDC?hdc,UINT?fMode);

該函數(shù)為指定設(shè)備環(huán)境設(shè)置文字對齊標(biāo)志。

caseWM_SIZE: ???????//?WM_SIZE傳回客戶區(qū)的尺寸

cxClient?=?LOWORD?(lParam)?; ???????? ???

cyClient?=?HIWORD?(lParam)?; ???????? ???

return?0?;

在許多Windows程序中,WM_SIZE消息必然跟著一個WM_PAINT消息。為什么呢?因?yàn)樵谖覀兌x窗口類別時指定窗口類別樣式為:

CS_HREDRAW?|?CS_VREDRAW

很容易在應(yīng)用程序中包含水平或者垂直的滾動條,程序?qū)懽髡咧恍枰?font face="Times New Roman">CreateWindow的第三個參數(shù)中包括窗口樣式(WS)標(biāo)識符WS_VSCROLL(垂直卷動)和/WS_HSCROLL(水平卷動)即可。這些卷動列通常放在窗口的右部和底部,伸展為顯示區(qū)域的整個長度或?qū)挾取o@示區(qū)域不包含卷動列所占據(jù)的空間。對于特定的顯示驅(qū)動程序和顯示分辨率,垂直卷動列的寬度和水平卷動列的高度是恒定的。如果需要這些值,可以使用GetSystemMetrics呼叫來取得(如前面的程序那樣)。

滾動條的范圍和位置
SetScrollRange?(hwnd,?iBar,?iMin,?iMax,?bRedraw)?;

BOOL?SetScrollRange(?  HWND?hWnd,?//?窗口句柄?  

int?nBar,?//?滾動條類型?  

int?nMinPos,?//?滾動條的最小位置?  

int?nMaxPos,?//?滾動條的最大位置?  

BOOL?bRedraw?//?重繪標(biāo)志?  );

int?SetScrollPos(HWND?hWnd,????//?窗體句柄?  ??

int?nBar,?????//?滾動條?  ??

int?nPos,?????//?滾動條的新位置?  ??

BOOL?bRedraw???//?重繪標(biāo)志?  );

為了給使用者提供回饋,Windows在您用鼠標(biāo)拖動卷動方塊時移動它,同時您的程序會收到SB_THUMBTRACK消息。然而,如果不通過呼叫SetScrollPos來處理SB_THUMBTRACKSB_THUMBPOSITION消息,在使用者釋放鼠標(biāo)鍵后,卷動方塊會迅速跳回原來的位置。

程序能夠處理SB_THUMBTRACKSB_THUMBPOSITION消息,但一般不同時處理兩者。如果處理SB_THUMBTRACK消息,在使用者拖動卷動方塊時您需要移動顯示區(qū)域的內(nèi)容。而如果處理SB_THUMBPOSITION消息,則只需在使用者停止拖動卷動方塊時移動顯示區(qū)域的內(nèi)容。處理SB_THUMBTRACK消息更好一些(但更困難),對于某些型態(tài)的數(shù)據(jù),您的程序可能很難跟上產(chǎn)生的消息。

如果您希望立即更新無效區(qū)域,可以在呼叫InvalidateRect之后呼叫UpdateWindow

建立更好的滾動

Win32?API介紹的兩個滾動條函數(shù)稱作SetScrollInfoGetScrollInfo。這些函數(shù)可以完成以前函數(shù)的全部功能,并增加了兩個新特性。

SetScrollInfo?(hwnd,?iBar,?&si,?bRedraw)?; ????????

GetScrollInfo?(hwnd,?iBar,?&si)?;

在呼叫SetScrollInfoGetScrollInfo之前,必須將cbSize字段設(shè)定為結(jié)構(gòu)的大小:

si.cbSize?=?sizeof?(SCROLLINFO)?;

第五章

取得設(shè)備內(nèi)容句柄

最常用的取得并釋放設(shè)備內(nèi)容句柄的方法是,在處理WM_PAINT消息時,使用BeginPaintEndPaint呼叫:

hdc?=?BeginPaint?(hwnd,?&ps)?; ????????

其它行程序 ????????

EndPaint?(hwnd,?&ps)?;

變量ps是型態(tài)為PAINTSTRUCT的結(jié)構(gòu),該結(jié)構(gòu)的hdc字段是BeginPaint傳回的設(shè)備內(nèi)容句柄。?PAINTSTRUCT結(jié)構(gòu)又包含一個名為rcPaintRECT(矩形)結(jié)構(gòu),rcPaint定義一個包圍窗口顯示區(qū)域無效范圍的矩形。使用從BeginPaint獲得的設(shè)備內(nèi)容句柄,只能在這個區(qū)域內(nèi)繪圖。BeginPaint呼叫使該區(qū)域有效。

Windows程序還可以在處理非WM_PAINT消息時取得設(shè)備內(nèi)容句柄:

hdc?=?GetDC?(hwnd)?;??????

其它行程序???????

ReleaseDC?(hwnd,?hdc)?;

Windows程序還可以取得適用于整個窗口(而不僅限于窗口的顯示區(qū)域)的設(shè)備內(nèi)容句柄:

hdc?=?GetWindowDC?(hwnd)?; ????????

其它行程序 ????????

ReleaseDC?(hwnd,?hdc)?;

這個設(shè)備內(nèi)容除了顯示區(qū)域之外,還包括窗口的標(biāo)題列、菜單、滾動條和框架(frame)。GetWindowDC函數(shù)很少使用,如果想嘗試用一用它,則必須攔截處理WM_NCPAINT消息,Windows使用該消息在窗口的非顯示區(qū)域上繪圖。

取得設(shè)備內(nèi)容句柄的另一個更通用的函數(shù)是CreateDC

hdc?=?CreateDC?(pszDriver,?pszDevice,?pszOutput,?pData)?; ????????

其它行程序 ????????

DeleteDC?(hdc)?;

例如,您可以通過下面的呼叫來取得整個屏幕的設(shè)備內(nèi)容句柄:

hdc?=?CreateDC?(TEXT?("DISPLAY"),?NULL,?NULL,?NULL)?;

取得設(shè)備內(nèi)容信息

一個設(shè)備內(nèi)容通常是指一個實(shí)際顯示設(shè)備,如視訊顯示器和打印機(jī)。通常,您需要取得有關(guān)該設(shè)備的信息,包括顯示器的大小(單位為圖素或者實(shí)際長度單位)和色彩顯示能力。您可以通過呼叫GetDeviceCaps(「取得設(shè)備功能」)函數(shù)來取得這些信息:

iValue?=?GetDeviceCaps?(hdc,?iIndex)?;

某些情況下,您可能想改變某些設(shè)備內(nèi)容屬性,用改變后的屬性進(jìn)行繪圖,然后恢復(fù)原來的設(shè)備內(nèi)容。要簡化這一過程,可以通過如下呼叫來保存設(shè)備內(nèi)容的狀態(tài):

idSaved?=?SaveDC?(hdc)?;

現(xiàn)在,可以改變一些屬性,在想要回到呼叫SaveDC前存在的設(shè)備內(nèi)容時,呼叫:

RestoreDC?(hdc,?idSaved)?;

SetPixel?(hdc,?x,?y,?crColor)?;

GetPixel函數(shù)傳回指定坐標(biāo)處的圖素顏色:

crColor?=?GetPixel?(hdc,?x,?y)?;

畫一條直線,必須呼叫兩個函數(shù)。第一個函數(shù)指定了線的開始點(diǎn),第二個函數(shù)指定了線的終點(diǎn):

MoveToEx?(hdc,?xBeg,?yBeg,?NULL)?; ????????

LineTo?(hdc,?xEnd,?yEnd)?;

如果您需要目前位置,就可以通過以下呼叫獲得:

GetCurrentPositionEx?(hdc,?&pt)?;

當(dāng)您要將數(shù)組中的點(diǎn)連接成線時,使用Polyline函數(shù)要簡單得多。下面這條敘述畫出與上面一段程序代碼相同的矩形:

POINT?apt[5]?=?{?100,?100,?200,?100,?200,?200,?100,?200,?100,?100?}?;

注意,最后一個點(diǎn)與第一個點(diǎn)相同。現(xiàn)在,只需要使用MoveToEx移到第一個點(diǎn),并對后面的點(diǎn)使用LineTo

Polyline?(hdc,?apt,?5)?;

MoveToEx?(hdc,?apt[0].x,?apt[0].y,?NULL)?; ????????

PolylineTo?(hdc,?apt?+?1,?4)?;

PolylineTo有些不同,這個函數(shù)使用目前位置作為開始點(diǎn),并將目前位置設(shè)定為最后一根線的終點(diǎn)。

邊界框函數(shù)
問題在于,RectangleEllipseRoundRectChordPie函數(shù)嚴(yán)格來說不是畫線函數(shù)。沒錯,這些函數(shù)是在畫線,但它們同時又填入畫刷填入一個封閉區(qū)域。

這些函數(shù)中最簡單的就是畫一個矩形:

您知道了如何畫矩形,也就知道了如何畫橢圓,因?yàn)樗鼈兪褂玫膮?shù)都是相同的:

Ellipse?(hdc,?xLeft,?yTop,?xRight,?yBottom)?;

Rectangle?(hdc,?xLeft,?yTop,?xRight,?yBottom)?;

畫圓角矩形的函數(shù)使用與函數(shù)RectangleEllipse函數(shù)相同的邊界框,還包含另外兩個參數(shù):

RoundRect?(hdc,?xLeft,?yTop,?xRight,?yBottom, ???????? ???????????xCornerEllipse,?yCornerEllipse)?;

???????

ArcChordPie函數(shù)都只要相同的參數(shù):

Arc(hdc,?xLeft,?yTop,?xRight,?yBottom,?xStart,?yStart,?xEnd,?yEnd)?;?????

Chord?(hdc,?xLeft,?yTop,?xRight,?yBottom,?xStart,?yStart,?xEnd,?yEnd)?;?????

Pie(hdc,?xLeft,?yTop,?xRight,?yBottom,?xStart,?yStart,?xEnd,?yEnd)?;

Windows?98中,您不需要知道這些公式。要畫一條或多條連接的貝塞爾曲線,只需呼叫:

PolyBezier?(hdc,?apt,?iCount)?;????PolyBezierTo?(hdc,?apt,?iCount)?;

使用現(xiàn)有畫筆(Stock?Pens
HPEN?hPen?;

hPen?=?GetStockObject?(WHITE_PEN)?;

SelectObject?(hdc,?hPen)?;

SelectObject的傳回值是此呼叫前設(shè)備內(nèi)容中的畫筆句柄。如果啟動一個新的設(shè)備內(nèi)容并呼叫

hPen?=?SelectObject?(hdc,?GetStockobject?(WHITE_PEN))?;

畫筆的建立、選擇和刪除
盡管使用現(xiàn)有畫筆非常方便,但卻受限于實(shí)心的黑畫筆、實(shí)心的白畫筆或者沒有畫筆這三種情況。如果想得到更豐富多彩的效果,就必須建立自己的畫筆。

這一過程通常是:使用函數(shù)CreatePenCreatePenIndirect建立一個「邏輯畫筆」,這僅僅是對畫筆的描述。這些函數(shù)傳回邏輯畫筆的句柄;然后,呼叫SelectObject將畫筆選進(jìn)設(shè)備內(nèi)容。

CreatePen函數(shù)的語法形如:

hPen?=?CreatePen?(iPenStyle,?iWidth,?crColor)?;

要使用CreatePenIndirect,首先定義一個LOGPEN型態(tài)的結(jié)構(gòu):

LOGPEN?logpen?;

hPen?=?CreatePenIndirect?(&logpen)?;

您可以通過如下呼叫來改變Windows用來填入空隙的背景色

SetBkColor?(hdc,?crColor)?;

通過將背景模式轉(zhuǎn)換為TRANSPARENT,可以阻止Windows填入空隙:

SetBkMode?(hdc,?TRANSPARENT)?;

此后,Windows將忽略背景色,并且不填入空隙,可以通過呼叫GetBkMode來取得目前背景模式(TRANSPARENT或者OPAQUE)。

繪圖方式

可以通過以下呼叫在設(shè)備內(nèi)容中設(shè)定新的繪圖模式:

SetROP2?(hdc,?iDrawMode)?;

iDrawMode參數(shù)是表中「繪圖模式」一欄中給出的值之一。您可以用函數(shù):

iDrawMode?=?GetROP2?(hdc)?;

如果您想畫一個沒有邊界框的圖形,可以將NULL_PEN選進(jìn)設(shè)備內(nèi)容:

SelectObject?(hdc,?GetStockObject?(NULL_PEN))?;

如果您想畫出圖形的邊界框,但不填入內(nèi)部,則將NULL_BRUSH選進(jìn)設(shè)備內(nèi)容:

SelectObject?(hdc,?GetStockobject?(NULL_BRUSH)?;

對于PolygonPolyPolygon函數(shù),Windows使用定義在設(shè)備內(nèi)容中的目前畫刷來填入這個帶邊界的區(qū)域。至于填入內(nèi)部的方式,則取決于多邊形填入方式,您可以用SetPolyFillMode函數(shù)來設(shè)定:

SetPolyFillMode?(hdc,?iMode)?;

FillRect?(hdc,?&rect,?hBrush)?; ????????

FrameRect?(hdc,?&rect,?hBrush)?; ???????? I

nvertRect?(hdc,?&rect)?;

在這些函數(shù)中,rect參數(shù)是一個RECT型態(tài)的結(jié)構(gòu),它包含有4個字段:lefttoprightbottom。這個結(jié)構(gòu)中的坐標(biāo)被當(dāng)作邏輯坐標(biāo)。

FillRect用指定畫刷來填入矩形(直到但不包含rightbottom坐標(biāo)),該函數(shù)不需要先將畫刷選進(jìn)設(shè)備內(nèi)容。

FrameRect使用畫刷畫矩形框,但是不填入矩形。使用畫刷畫矩形看起來有點(diǎn)奇怪,因?yàn)閷τ谖覀兯榻B過的函數(shù)(如Rectangle),其邊線都是用目前畫筆繪制的。FrameRect允許使用者畫一個不一定為純色的矩形框。該邊界框?yàn)橐粋€邏輯單位元寬。如果邏輯單位大于設(shè)備單位,則邊界框?qū)?/font>2個圖素寬或者更寬。

InvertRect將矩形中所有圖素翻轉(zhuǎn),1轉(zhuǎn)換成00轉(zhuǎn)換為1,該函數(shù)將白色區(qū)域轉(zhuǎn)變成黑色,黑色區(qū)域轉(zhuǎn)變?yōu)榘咨?#xff0c;綠色區(qū)域轉(zhuǎn)變成洋紅色。

但是,通過呼叫SetRect函數(shù),只需要一道敘述就可以得到同樣的結(jié)果:

SetRect?(&rect,?xLeft,?yTop,?xRight,?yBottom)?;

在您想要做以下事情之一時,可以很方便地選用其它8個函數(shù):

·?將矩形沿x軸和y軸移動幾個單元:
 

OffsetRect?(&rect,?x,?y)?;

·?增減矩形的尺寸:
 

InflateRect?(&rect,?x,?y)?;

·?矩形各字段設(shè)定為0
 

SetRectEmpty?(&rect)?;

·?將矩形復(fù)制給另一個矩形:
 

CopyRect?(&DestRect,?&SrcRect)?;

·?取得兩個矩形的交集:
 

IntersectRect?(&DestRect,?&SrcRect1,?&SrcRect2)?;

·?取得兩個矩形的聯(lián)集:
 

UnionRect?(&DestRect,?&SrcRect1,?&SrcRect2)?;

·?確定矩形是否為空:
 

bEmpty?=?IsRectEmpty?(&rect)?;

·?確定點(diǎn)是否在矩形內(nèi):
 

bInRect?=?PtInRect?(&rect,?point)?;

PeekMessage?(&msg,?NULL,?0,?0,?PM_REMOVE)?;

前面的四個參數(shù)(一個指向MSG結(jié)構(gòu)的指針、一個窗口句柄、兩個值指示消息范圍)與GetMessage的參數(shù)相同。將第二、三、四個參數(shù)設(shè)定為NULL0時,表明我們想讓PeekMessage傳回程序中所有窗口的所有消息。如果要將消息從消息隊(duì)列中刪除,則將PeekMessage的最后一個參數(shù)設(shè)定為PM_REMOVE。如果您不希望刪除消息,那么您可以將這個參數(shù)設(shè)定為PM_NOREMOVE

while?(TRUE) ????????

{ ???????? ????

if?(PeekMessage?(&msg,?NULL,?0,?0,?PM_REMOVE)) ???????? ????

{ ???????? ????????????

if?(msg.message?==?WM_QUIT) ???????? ???????????????????

break?; ???????? ????????????

TranslateMessage?(&msg)?; ???????? ????????????

DispatchMessage?(&msg)?; ???????? ????

} ???????? ????

else ???????? ????

{ ???????? ????????????

//?完成某些工作的其它行程序 ???????? ????

} ????????

} ????????

return?msg.wParam?;

轉(zhuǎn)載于:https://blog.51cto.com/hantayi/384162

總結(jié)

以上是生活随笔為你收集整理的sdk笔记1的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。