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

作者: w0005151 (藍廳)   2016-03-03 23:58:15
平台:Visual Studio 2010
小弟最近在學視窗程式的編寫
想說先從最底層的Win32 API開始,應該能比較了解整個視窗的運作
但...找了一下坊間講到C++視窗程式的書大多都是講MFC
對於Win32 API都只有幾頁帶過,教你怎麼創個空的視窗就沒了
有研究一下那些在講MFC的書,覺得那對小弟而言實在太難了
而且版上大大好像也不推薦
所以我打算把Win32 API的一些基礎跟流程摸熟之後轉至Qt
Qt對我而言應該是比較好上手
以下是小弟的問題
我現在在主視窗中開了兩個EDIT WINDOW跟一個BUTTON
想要作一些簡單的功能
程式碼部分:
先宣告了全域變數
HWND B1,B2,text1; //存子視窗的handle
TCHAR ch1[100]=" "; //之後要用的字串
在WinMain函式裡面把BUTTON跟EDIT視窗的handle存進去
B1 = CreateWindow(
_T("BUTTON"),
_T("按鈕1"),
WS_CHILD|WS_VISIBLE|WS_BORDER,
10, 10, 50, 20,
hWnd, NULL, hInstance, NULL);
text1 = CreateWindow(
_T("EDIT"),
NULL,
WS_CHILD|WS_VISIBLE|WS_BORDER,
80, 10, 100, 20,
hWnd, NULL, hInstance, NULL);
text2 = CreateWindow(
_T("EDIT"),
NULL,
WS_CHILD|WS_VISIBLE|WS_BORDER,
80, 40, 100, 20,
hWnd, NULL, hInstance, NULL);
SendMessage(text2,ES_READONLY,0,0);
然後在WndProc函式裡
case WM_COMMAND:
{if (HWND(lParam) == B1)
{
SendMessage(text2,EM_UNDO,0,0);
SendMessage(text1,EM_GETLINE,0,(LPARAM)ch1);
K=int(ch1[0]);
K-=48;//0在unicode是48
K*=2;//數字乘2
K+=48;//數字變回對應的unicode碼
ch1[0]=TCHAR(K);
SendMessage(text2,EM_REPLACESEL,1,(LPARAM)ch1);
InvalidateRect(hWnd,NULL,TRUE);
}
return 0;}
上面的功能就是要讓使用者在第一個EDIT輸入數字
按按鈕後就會讓該數字乘以2後顯示在第二個EDIT
但是...上面的做法沒有考慮輸入或輸出超過兩位的情況,而且也不能處理浮點數
雖然硬要做還是可以(用個迴圈檢查有沒有小數點之類的)
想請問如果要做這種接受數字型態input的視窗程式有沒有更好的作法?
另外再請問一下用CreateWindow做出來的BUTTON有沒有辦法幫他定義識別碼ID?
還是只能用全域變數紀錄他的handler?
還有WndProc接收的HWND型態的引數hWnd是哪一個視窗的handler?
就我所了解程式呼叫WndProc的時機是訊息迴圈從訊息佇列抓到訊息
然後呼叫DisPatch函式後進入
但是他好像也不是目前送出訊息的視窗的handler
因為if條件那邊如果改成 if(hWnd == B1)的話
按按鈕就沒有反應了
那這個hWnd到底是誰勒??
另外處理不同的訊息只用這種 if switch case的寫法嗎
這樣如果程式規模越來越大感覺會很難維護
感謝大大解答,剛開始學習視窗程式實在有好多疑問
作者: w0005151 (藍廳)   2016-03-04 00:02:00
抱歉 這個才對http://imgur.com/UWUUfyi
作者: stupid0319 (徵女友)   2016-03-04 23:31:00
visual studio 能直接拖拉元件,很方便了

Links booklink

Contact Us: admin [ a t ] ucptt.com