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

看板C_and_CPP作者時間8年前 (2016/03/04 09:36), 編輯推噓1(102)
留言3則, 2人參與, 最新討論串2/3 (看更多)
※ 引述《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++ 語言的. 以上都是憑印象回答, 如果有誤就抱歉啦. -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 211.72.212.239 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1457055382.A.537.html

03/04 17:34, , 1F
感謝回答,EDIT加上ES_NUMBER好像只是限制使用者的輸入
03/04 17:34, 1F

03/04 17:34, , 2F
只能是數字,但還是要靠自己把他從char轉成int@@
03/04 17:34, 2F

03/04 19:38, , 3F
這很容易 用sstream可以把字串轉成int或float
03/04 19:38, 3F
文章代碼(AID): #1MsEQMKt (C_and_CPP)
文章代碼(AID): #1MsEQMKt (C_and_CPP)