Windows编程初步(三)【说明:有敏感字眼已全删,不知道为啥还审核不通过】
第三節(jié) 設計輸出及利用在線幫助
在Windows中,消息ON_PAINT是專門用來處理輸出的。基本所有的輸出代碼應放在這里。
。其輸出方式不再限于從上往下,而是全屏可控,因此每個輸出都需要告知系統(tǒng)輸出位置。典型的文字輸出代碼是TextOut函數(shù)。
將WM_PAINT消息處理的內(nèi)容保留BeginPaint和EndPaint函數(shù)調(diào)用,刪除其他內(nèi)容,用圖中的內(nèi)容替代。可以發(fā)現(xiàn)屏幕輸出的內(nèi)容改變了。TextOut函數(shù)使用一個叫做HDC類型的變量hdc,HDC叫做輸出設備句柄,可以理解為一個結(jié)構(gòu)體指針,在BeginPaint函數(shù)中被指向當前顯示屏有關(guān)結(jié)構(gòu),而在EndPaint函數(shù)中釋放這個指針的關(guān)聯(lián)(即EndPaint函數(shù)之后,該句柄就不能被使用了)。其所指向的內(nèi)容存儲了和輸出有關(guān)的默認屬性。例如,隱含的屬性包括用什么字體,用幾號字,采用字體的顏色等。其后兩個參數(shù)是屏幕坐標,屏幕坐標以像素為單位,左上角為0,0點。最后兩個參數(shù)是待輸出字符串的地址和字符串長度。
若要修改默認屬性,例如使用一種新的字體如楷書,并且調(diào)整字體的大小——即變更字號,更換字體的顏色怎么辦呢?Windows使用一組相關(guān)函數(shù)更改屬性,例如SetTextColor函數(shù)將字體顏色設置為新的顏色,同時返回原先使用的顏色。當然在畫圖工作完畢后,應將字體顏色設置回原先的顏色,以免破壞其他程序的文字輸出行為。SetTextColor函數(shù)具體使用可見后面的例子。
當用戶希望顯示魏碑字體而不是系統(tǒng)默認的新宋體時,則過程略微復雜一些。字體有大小和是否粗體和下劃線等屬性,畫刷有顏色屬性和貼圖屬性,畫筆有顏色和粗細以及畫實線還是虛線等屬性,這樣一些復雜的對象被稱為GDI對象。當用戶打算使用自定義的GDI對象時,可以使用各自的創(chuàng)建函數(shù)可以創(chuàng)建這些對象并得到對象句柄(可以理解為GDI對象的結(jié)構(gòu)體的指針),然后使用SelectObject將這些對象句柄選入輸出設備結(jié)構(gòu)體中(HDC),同時得到HDC中原先使用的對象句柄。在使用完畢這些自定義對象后,應該將原先HDC中使用的默認對象選回,最后使用同一的DeleteHandle函數(shù)刪除這些自定義對象。
下面的例子中創(chuàng)建一個字體,輸出一段文字,再使用矩形把字體框住。
省略……
關(guān)于Windows畫圖的可用函數(shù),可以從如圖所示MSDN中找到
圖 13 GDI幫助的位置以及初學者可以輕松閱讀和應該精讀的章節(jié)
第四節(jié)對話框與輸入設計
Windows 是一種全屏的圖形界面,使用行輸入的scanf雖然簡單但是不能滿足用戶的需要,用戶有可能在輸入一段內(nèi)容以后回過頭修改前面輸入的內(nèi)容。這時候需要使用全屏輸入系統(tǒng)。在Windows中最常見的全屏輸入系統(tǒng)是對話框。為允許用戶輸入數(shù)據(jù),程序員需要使用對話框進行輸入輸出操作。下面設計一個輸入顧客姓名和出生月日,輸出其星座信息的程序。
首先按照程序中涉及的數(shù)據(jù)的邏輯相關(guān)性,可定義以下數(shù)據(jù)結(jié)構(gòu)。注意其中全局變量MyCustomer。
程序片段8 星座之數(shù)據(jù)
然后在左側(cè)資源視圖中鼠標右鍵點擊Dialog,調(diào)出快捷菜單,選擇Insert Dialog
圖14 新建對話框以及結(jié)果
從右圖的控件欄中,分三次每次拖動一個 到對話框中。這個是靜態(tài)文本,將用來提示用戶旁邊輸入什么數(shù)據(jù)。右鍵點擊第一個靜態(tài)文本,出現(xiàn)下圖對話框,將文字內(nèi)容修改為姓名。
圖15 設置姓名輸入
從控件工具箱中,拖動一個 到對話框中,這個叫做編輯框EditBox,用戶可以在這里輸入一些字符。——其作用將相當于命令提示符下的scanf。將這個編輯框放在姓名邊上。右鍵點擊編輯框,將ID改名為IDC_NAME.如圖
圖16 修改姓名輸入框?qū)傩?/p>
再次從控件工具箱中拖動 到對話框中。這個叫做組合框ComboBox,可以向用戶提供一些預先設置好的選項,用戶可以從這些選項中選擇一項。右鍵點擊組合框,如圖設置屬性。注意在輸入數(shù)據(jù)時,需要按CTRL+回車鍵輸入下一行數(shù)據(jù)。這里輸入月份數(shù)據(jù)的目的是為了觀察對話框執(zhí)行時其效果是否良好,在程序中還需再輸入一次。
圖17 設置月份下拉框?qū)傩?/p>
最后再拖動一個編輯框到對話框,修改屬性如圖
圖18 設置生日輸入框?qū)傩?/p>
右鍵點擊OK和Cancel按鈕(Button)將標題修改為“確定”和“取消”,然后拖動OK和Cancel按鈕,使之更美觀些,設置完畢后,可以按下 按鈕來測試一下你設計的輸入界面的效果。
圖19 測試運行效果
注意到下拉框只能同時看到兩個選項,可以回到對話框設計界面,點擊組合框的下箭頭,就可以拉伸選擇區(qū)域可以看到的內(nèi)容。
圖20 修改組合框顯示數(shù)據(jù)行
最后,這個對話框的目的是為了輸入顧客信息,所以應該給這個對話框換個更好的名字。右鍵點擊資源視圖中新建對話框的名字(原先的名字是IDD_DIALOG1),在對話框中修改ID號如下圖:
圖21修改對話框名字
以上內(nèi)容完成了一個輸入界面設計,下面需要通過程序運作這個對話框。
從系統(tǒng)給出的樣例代碼中,復制AboutProc消息處理函數(shù),修改函數(shù)名為InputCustomer,這個函數(shù)專門處理顧客信息輸入。代碼如下:
程序片段9 顧客信息的輸入與編輯
下面需要確定合適的時機來輸入顧客信息。方法可以很多,例如當你從菜單中選擇一項“輸入顧客信息”的命令——使用菜單的方法,前面已經(jīng)介紹過;或者當你按下回車鍵時輸入顧客信息——這需要對按下鍵盤作出響應;當你用鼠標在空白地方點擊窗口時輸入,也是個不錯的選擇——這需要對用戶鼠標動作作出響應。下面用鼠標響應來作為顧客信息輸入的事件。
鼠標動作其實很多,左鍵,右鍵,中鍵,按下,松開,雙擊都各自有不同的事件定義。對于每個事件系統(tǒng)都會告訴程序,事件發(fā)生的坐標。下面是一個簡表可以瀏覽一下。
下面的示例程序中使用了鼠標左鍵雙擊事件,其用戶操作的設計如下,當用戶雙擊屏幕上任意一點時,彈出顧客對話框。注意,因為程序設計為在大窗口中雙擊而彈出顧客輸入框,因此下面這段消息響應代碼應該放置在MainWndProc中。
程序片段10 激發(fā)“輸入顧客 ”對話框
一般情況下,窗口時不響應雙擊消息的。為使主窗口能夠接受并處理鼠標雙擊消息,需要修改主窗口的風格。
程序片段11 修改主窗口的處理風格
當顧客輸入完畢,按下“確定”按鈕后,應該在屏幕上顯示相應的星座。修改WM_PAINT消息如下:
程序片段12 顯示顧客星座數(shù)據(jù)
圖22 運行結(jié)果
總結(jié)
以上是生活随笔為你收集整理的Windows编程初步(三)【说明:有敏感字眼已全删,不知道为啥还审核不通过】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【各种信噪比联系与区别详解】实信号、复信
- 下一篇: fftw库在windows下的的编译和配