Re: [問題] C++ Win32 API EDIT Window的問題

作者: icetofux   2016-03-04 09:36:19
※ 引述《w0005151 (藍廳)》之銘言:
: 平台:Visual Studio 2010
: 小弟最近在學視窗程式的編寫
: 想說先從最底層的Win32 API開始,應該能比較了解整個視窗的運作
: 但...找了一下坊間講到C++視窗程式的書大多都是講MFC
: 對於Win32 API都只有幾頁帶過,教你怎麼創個空的視窗就沒了
: 有研究一下那些在講MFC的書,覺得那對小弟而言實在太難了
: 而且版上大大好像也不推薦
: 所以我打算把Win32 API的一些基礎跟流程摸熟之後轉至Qt
: Qt對我而言應該是比較好上手
除非很有興趣或是有特殊需求, 不然直接學 QT 應該會較快, 我記得 QT 用起來跟用
API 刻視窗風格上完全不同. 如果最終目的是 QT, 先學會這個幫助應該不大.
: 但是...上面的做法沒有考慮輸入或輸出超過兩位的情況,而且也不能處理浮點數
: 雖然硬要做還是可以(用個迴圈檢查有沒有小數點之類的)
: 想請問如果要做這種接受數字型態input的視窗程式有沒有更好的作法?
在 CreateWindow 的 dwStyle 參數裡加入 ES_NUMBER 應該就只能輸入數字
但不確定浮點數能不能
: 另外再請問一下用CreateWindow做出來的BUTTON有沒有辦法幫他定義識別碼ID?
: 還是只能用全域變數紀錄他的handler?
我記得可以在 CreateWindow 的 hMenu 參數定義一個識別碼, 在 WndProc 裡檢測
事件時比對識別碼來看是誰觸發的, 可是後來我還是習慣比 hwnd, 因為
1. 還是得用全域變數或其他方法記錄這個識別碼.
2. 訊息迴圈裡的比較步驟並沒有比較簡單.
: 還有WndProc接收的HWND型態的引數hWnd是哪一個視窗的handler?
: 就我所了解程式呼叫WndProc的時機是訊息迴圈從訊息佇列抓到訊息
: 然後呼叫DisPatch函式後進入
: 但是他好像也不是目前送出訊息的視窗的handler
: 因為if條件那邊如果改成 if(hWnd == B1)的話
: 按按鈕就沒有反應了
: 那這個hWnd到底是誰勒??
應該是這個訊息迴圈主視窗的 handle.
: 另外處理不同的訊息只用這種 if switch case的寫法嗎
: 這樣如果程式規模越來越大感覺會很難維護
我有試過把各種元件包成一個類別, 然後統一用一個 vector 來儲存視窗上每個元件
的 hwnd, 當事件觸發時只要用檢查有該事件的元件哪個符合即可.
比方說發生 BN_CLICKED 只要去檢查 lpClassName 是 BUTTON 的元件即可.
本質上它還是一堆 if/switch 判斷式, 但因為加上 vector 可以用迭代的方式去比對
, 程式碼看起來會乾淨很多.
: 感謝大大解答,剛開始學習視窗程式實在有好多疑問
我對這方面也很有興趣, 但不得不說資料真的不好找, 目前最主要的資料來源還是 MSDN,
其他有些網站雖然對於 API 有更白話的說明, 不過不是 C/C++ 語言的.
以上都是憑印象回答, 如果有誤就抱歉啦.
作者: w0005151 (藍廳)   2016-03-04 17:34:00
感謝回答,EDIT加上ES_NUMBER好像只是限制使用者的輸入只能是數字,但還是要靠自己把他從char轉成int@@
作者: icetofux   2016-03-04 19:38:00
這很容易 用sstream可以把字串轉成int或float

Links booklink

Contact Us: admin [ a t ] ucptt.com