天天看點

windows程式設計學習劄記

2013.10.04

1.mciSendString()

四個參數,我的問題出在第一個參數上,因為預設的路徑名不能含空格,找到的一種解決辦法是将路徑部分用雙引号括起,不過雙引号前要反斜杠“\”轉義(eg. mcisendstring("open \"D:\\program files\\a.mp3\" alias pra",.......)),這樣問題就完美解決了。

2.關于ComboBox_AddString()和ComboBox_InsertString()

書上說這兩個并不是函數,而是一個宏,表示目前還不了解,姑且先記下再說。ComboBox_AddString()往控件添加東西時有時候順序會被編譯器打亂,以緻接下來用ComboBox_GetCurSel()獲得索引時會變得相當混亂。而ComboBox_InsertString()則不會出現這種情況,完全按照代碼添加的順序從零開始計數,感覺這非常好。

這是目前為止遇到的兩個自我感覺比較DT的問題,先記下。

2013.10.05

3.基于對話框的程式設計中關于為控件中的按鈕添加鍵盤快捷鍵的一些問題

如果隻是建立基于對話框的工程,那麼會在WinMain中沒有入口進入消息循環(始終在DialogBox中執行),也就無法執行TranslateAccelarators,快捷鍵自然無法使用。也就是說,建立工程時,仍應建立window工程,然後用再用載入資源的辦法載人一個對話框,代碼中應添加LoadAccelerators()和HWND hwnd = CreateDialog(),具體參數就不寫了,重點是第四個參數,是那個回調函數的函數名,正是由第4個參數将程式帶入回調函數中,才有了快捷鍵被翻譯等一系列過程。不過有一點我不太明白,就是需要将其強制轉換為DLGPROC,否則編譯報錯。最後,就是實作快捷鍵操作,在回調函數的case WM_COMMAND中,if(LOWORD(wParam)==IDOK)...(IDOK指代所有在Accelerators裡定義的快捷鍵),這樣,對話框下的對應按鈕快捷鍵就可以設定完成了。(網上還提供有其他方法,比如RegisterHotKey之類的,都會涉及到MFC,有些函數形式目前不懂...)。

2013.10.09

4.關于用mciSendString()播放AVI等視訊

如果隻是按照原先播放MP3那樣填寫參數(檔案名後需加type MPEGVideo 注明是視訊格式),那樣會自動跳出一個控件播放,且無法控制。如果想直接在父視窗播放,可添加一個控件(注意:windows工程中,隻能是動畫控件,而MFC中,用圖檔控件就可以實作),用GetDlgItem擷取動畫控件句柄, 然後需用sprintf(buf,“open \".....(path)\" type MPEGVideo alias a parent %u style %u notify ”,hw(動畫控件句柄),WS_CHILD),将其寫進buf中,然後在mcisendstring直接用buf(如果直接在mcisendstring裡寫進字元串的話程式會直接終止,原因目前不知道),之後就沒什麼大問題,順利播放。

2013.10.14

5.對于第一個問題的補充

對于第一個問題,又找到另外一種解決方法,就是聲明兩個字元數組buf1[256],buf2[256],利用GetShortPathName()将位址寫進buf1,再利用sprintf()将mcisendstring的第一個參數寫進buf2。

6.GetOpenFileName()和OPENFILENAME結構體

作用是顯示電腦中的打開檔案對話框,暫時沒用過,臨時看到的,先記下,具體參數參考MSDN。

2013.10.24

7.将wav整合進可執行檔案的方法

之前用PlaySound()或mciSendString(),參數都是路徑,無法将對應的音視訊檔案整合到可執行檔案中以緻無法使exe檔案在其他pc裡正常播放。昨晚找到的解決方法是将wav整合成資源檔案。具體做法是插入資源,引入,下拉菜單選wave,然後找到你要的wav,(目前像MP3之類檔案還沒有找到解決辦法......)。接下來是播放,用PlaySound()的話,直接就是将第一個參數改為MAKEINTRESOURCE(ID值),不過mciSendString()目前用相同的辦法還不能播放成功,遇到的問題很奇葩,待解決。另外,PlaySound()有明顯延遲現象,實際項目裡應該用不成。

2013.11.24

8.ComoboBox()問題

    先介紹一下問題,建立了一個非模态對話框,然後基于這個對話框,建立了一個comboBox控件,當用GetDlgItem()獲得其句柄時總會傳回NULL,也就是錯誤。這個問題隻在vs2012裡出現過,vc6.0裡完全沒問題。産生這個問題的主要原因有兩方面。

    a.在進入回調函數的一開始我就用了GetDlgItem()函數,試圖擷取其句柄,但這樣傳回NULL,可是如果在switch(message)裡加入一個case WM_INITDIALOG:再調用GetDlgItem()就完全沒問題了。

    b.還有一個問題,加入ComboBox控件時,記得點一下下拉的那個箭頭,那裡可以調大小,把邊框拉的長一些,否則即使加進去也顯示不出來(想不通VS怎麼會有這種設計)。

2013.11.25

9.消息循環機制的問題,建立兩個或兩個及以上對話框(非模态)的時候,有關對話框的回調函數default應該傳回FALSE,傳回預設的DefWindowProc有問題,比如messagebox()彈出後無法消失,原因跟消息循環機制有關。

10.windows程式設計中,将字元串宏定義為TCHAR類型,那麼在進行字元串比較判等之類的,需要将C語言裡的strcmp變為wcscmp,其他的相應變化。

2013.11.27

11.在listview控件中,有時候需要擷取目前選擇項進行編輯。有一種方法是while((-1)!=(nItem=ListView_GetNextItem(GetDlgItem(hTeacher,IDC_LIST), nItem,  LVNI_SELECTED))){};關于ListView_GetNextItem()這個API沒能弄太懂,不知道是如何運作的,但這樣确實可以。nItem是索引,當沒選擇時為-1。

2013.11.28

12. 資料轉換問題。将int型轉換為TCHAR型,_itot(int,TCHAR,進制),可以實作。将double類型轉化為TCHAR類型,可先聲明一個臨時的char型數組temp[],注意要初始化,利用sprintf将double寫入temp,然後調用mbstowcs(TCHAR x[],char y[],strlen(y))完成。

繼續閱讀