C干大事第三節(jié)_第1頁
C干大事第三節(jié)_第2頁
C干大事第三節(jié)_第3頁
C干大事第三節(jié)_第4頁
已閱讀5頁,還剩5頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、C干大事第三節(jié)1、怎么修改程序圖標,引入一個ico文件(可以用一些工具制作ico圖標,網上搜“制作ico”),然后命名ID為1,重新構建。2、在編寫控制臺程序的時候一切流程都是有先后關系、并行的,而且所有函數都是由我們來調用的,比如下面的實例性代碼:printf(確定請輸入y,取消輸入n);char c = getchar();/scanfif(c=y)/else if(c=n)/Void func1()MessageBox(NULL,TEXT(“按鈕1被按下了”).);Void func2()MessageBox(NULL,TEXT(“按鈕2被按下了”).);我們可以用getchar來等待用

2、戶輸入一個值。但是到了Windows編程中就不一樣了,同一時刻用戶即可能點擊【OK】按鈕,又可能點擊【Cancel】按鈕,又可能在文本框中輸入幾個字,還可能在窗口上雙擊幾下,這樣就無法同時等待用戶的這些動作。為了解決這個問題,Windows引入了消息機制(也可以叫做回調機制或者事件機制)。在程序啟動的時候把函數func1要響應【OK】按鈕1的點擊動作、函數func2要響應【Cancel】按鈕的點擊動作、函數func3要響應窗口的雙擊動作等等這些信息告訴Windows,然后當用戶執(zhí)行相應操作的時候Windows就會來主動調用你注冊的函數,主動通知你。不再是程序調用操作系統(tǒng)的函數,而是操作系統(tǒng)反過

3、來調用你的函數。Dont call me ,Ill call you!(也被人稱為“好萊塢法則”)。2、關于上面的這個問題要慢慢來理解,下面就來通過第一個例子來初步理解這個Dont call me ,Ill call you!/HANDLE_MSG的意思就是告訴Windows,當發(fā)生WM_COMMAND消息的時候,請/通知Main_OnCommand函數/id這個參數是Windows給咱們“送”過來的看Main_OnCommand方法,初探windows的消息機制。void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNot

4、ify)switch(id)case IDC_OK:MessageBox(hwnd,TEXT(歡迎訪問如鵬網/doc/13878d160b4e767f5acfcece.html大學生計算機學習社區(qū)),TEXT(問好),MB_OK);break;default:break;不同的控件要有不同的id,控件的名字,在人類.中名字有可能重名,但是在windows中id 不能重復按鈕被按下的時候Main_OnCommand方法被調用,hwnd是對話框句柄(什么是句柄后面講,通俗的說就是通過它能夠操縱對話框),id是控件的id,后兩個參數暫時不關心。Main_

5、OnCommand方法中根據id,也就是被點擊按鈕的名字來決定不同的動作。Hwnd是當前窗口的句柄,句柄就是把柄!操作一個東西,要先抓住他的把柄!通過句柄就可以操作這個對象。/不要忘了break/不要忘了case中用大括號3、定制自己的對話框,不同的按鈕不同的問好然后重新添加一個自己的按鈕,在屬性中修改Name屬性為IDC_BTNHELLO。控件名字的潛規(guī)則:所有控件的Name都以“IDC_”開頭,然后后邊跟著控件類型的簡稱(按鈕簡稱BTN、文本框簡稱EDT等等),最后才是控件的真正的名字。修改按鈕的Caption屬性(也就是按鈕上顯示的文字)為“問好”。編輯Main_OnCommand方法:

6、void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify) switch(id)case IDC_BTNHELLO:MessageBox(NULL,TEXT(世界你好),TEXT(問好),MB_OK);break;/不要忘記breakdefault:break;運行程序,點擊“問好”按鈕,咱們第一個響應按鈕動作的程序就做好了。4、自己動手寫計算器1.0版(1)、得到控件中用戶輸入的文本GetDlgItemText(hwnd,IDC_EDTNAME,str,sizeof(str);第一個參數是對話框的句柄;第二參數就

7、是控件的id(name);第三個參數就是字符串數組的指針;疑問:為什么不能像MessageBox一樣把字符串做為返回值返回呢?這就涉及到C語言中函數返回指針的問題了在函數內部返回函數內構建的指針有可能出現(xiàn)數據混亂.當f1函數在執(zhí)行的時候,這段內存是被占用的,一旦函數返回,那么內存就標記為可以被其他人、函數占用。如果你把這段內存中的指針返回了,那么一旦其他地方用了這段內存,那么你引用的就是錯誤的數據了。用GetWindowText、GetDlgItemText的時候為什么要傳數組名呢?復習:初學者可以認為數組名就是指針,函數只有得到指針,才能直接操作數組中的數據。(2)c語言中字符串連接:wsp

8、rintf(str,”.”,a1,a2);還有sprintf,但是在編寫windows程序的時候最好使用wsprintf。/GetDlgItemText(hwnd,IDC_EDITNAME,str,sizeof(str);/第一參數是窗口的句柄,第二個參數是要取得內容的控件的ID/第三個參數就是字符串指針,第四個參數就是指針指向區(qū)域的大小TCHAR name256;/為什么不用strlen,sizeof。/如鵬網站內搜索搜“strlen,sizeof”區(qū)別/Windows編程中一般都用TCHAR代替char。TCHAR有時候就是char。/解決Unicode、中文編碼問題。GetDlgItem

9、Text(hwnd,IDC_EDITNAME,name,sizeof(name);/printf是打印到屏幕上/printf(%s你好,name);/sprintf是打印到字符串中/相當于很多C#、Java語言里的字符串相加 name+你好/sprintf(字符串,.,a1,a2,a3.);TCHAR msg256;/sprintf(msg,%s你好,name);/wsprintf,C語言開發(fā)Windows程序的時候用wsprintf代替sprintf /解決中文等問題wsprintf(msg,%s你好,name);MessageBox(hwnd,msg,msg,MB_OK);(3)向用戶問好

10、TCHAR name256;GetDlgItemText(hwnd,IDC_EDTNAME,name,sizeof(name)/sizeof(TCHAR);TCHAR msg256;wsprintf (msg,%s你好,name);MessageBox(hwnd, msg,TEXT(問好),MB_OK);(4)C語言里邊字符串轉換為數字:atoi:ascii to int(5)編寫windows程序的時候最好用TCHAR來代替char,可以避免中文的問題case IDC_BTNHELLO:TCHAR name256;GetDlgItemText(hwnd,IDC_EDTNAME,name,si

11、zeof(name)/sizeof(TCHAR); int i = atoi(name);int j=i*2;TCHAR result256;itoa(j,result,10);MessageBox(hwnd,result,TEXT(問好),MB_OK);(6)Get、Set:配對的,設置對話框的值用SetDlgItemText:代碼:case IDC_BTNADD:/取第一個文本框的字符串,然后得到整數表示/ 取第二個文本框的字符串,然后得到整數表示/計算兩個整數的和/把和重新轉換成字符串,然后Messagebox出來。TCHAR cNumber1256;GetDlgItemText(hwn

12、d,IDC_EDTNUM1,cNumber1,sizeof(cNumber1)/sizeof(TCHA R);int n1 = atoi(cNumber1);TCHAR cNumber2256;GetDlgItemText(hwnd,IDC_EDTNUM2,cNumber2,sizeof(cNumber2)/sizeof(TCHA R);int n2 = atoi(cNumber2);int n3 = n1+n2;TCHAR cResult256;itoa(n3,cResult,10);SetDlgItemText(hwnd,IDC_EDTRESULT, cResult);break;/int

13、 i1;/int i2;/不能夢想著直接定義兩個int類型的參數,就讓windows告訴你兩個數的值TCHAR str1256;TCHAR str2256;GetDlgItemText(hwnd,IDC_EDIT1,str1,sizeof(str1); GetDlgItemText(hwnd,IDC_EDIT2,str2,sizeof(str2);/兩個字符串不能直接相加,要先轉換成int類型。/C標準庫函數:atoi,a:asciito i:int 理解了atoi的簡寫不用死記硬背了int i1=atoi(str1);int i2=atoi(str2);int i3=i1+i2;/printf(%i,i3);TCHAR str3256;itoa(i3,str3,2);/字符串轉換為整數,第三個參數就是進制。/wsprintf(str3,%i,i3);SetDlgItemText(hwnd,IDC_EDIT3,str3);(7)代碼中有UINT、TCHAR、LRESULT、HWND之類的新的數據類型,其實它們只是一些類型的別名而已,可以通過宏定義看出來。但是考慮到可移植性,盡量不要使用它們的真實類型。

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論