看板 C_and_CPP 關於我們 聯絡資訊
平台: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的寫法嗎 這樣如果程式規模越來越大感覺會很難維護 感謝大大解答,剛開始學習視窗程式實在有好多疑問 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.230.213.139 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1457020698.A.5D0.html 03/04 00:01
w0005151: 抱歉 這個才對http://imgur.com/UWUUfyi 03/04 00:02
※ 編輯: w0005151 (36.230.213.139), 03/04/2016 00:11:40
stupid0319: visual studio 能直接拖拉元件,很方便了 03/04 23:31