Re: [問題] 請問Windows API創建視窗的相關問題
為避免誤會愈積愈深,回個文。
另我知一直重覆引用、針對推文者的每句話做過度解讀是不禮貌之事,
唯此篇我認為只有這麼做,才可撥雲見日,
若有得罪,先行道歉。
同時認為有必要讓原 po 至少解決他的問題,這樣的討論才有意義。
至於針對原 po 之問題,此文也給予了解答。
歡迎討論,恭侯指教。
※ 引述《yoll522 (yolling)》之銘言:
: 請問一下,我用WINDOWS API寫了一個小程式
: 裡面我先Register了主視窗,接著CreatWindow
: 接著我有用LRESULT CALLBACK的方式來做『消息處理』
: ↑不知道該怎麼稱呼這個副程式
上面這四行說明了很明顯原 po 是用 Win32 API ,而不是 mfc。
: 可是我想請問一下,我要如何才能在主視窗的菜單下面那一片空白放東西呢?
: 好比放按鈕,貼文字之類等等的東西@@
上面這兩行說明了,原 po 要做的是像 MFC 裡面的 FormView。
: 例如如果要放按鈕,是該在Register的時候就弄好
: 還是CreateWindow的時候?又或者是在消息處理那邊做?
: 因為我的菜單就是在消息處理那邊直接WM_CREATE出來的@@
: 而我Dialog的視窗是用Visual studio直接拉出來的
: 那我如果要在主視窗放按鈕的話,也能像Dialog的方式拉出來嗎?
: 謝謝
上面的問題或許晚些解答好點。
接下來是一長串誤會的討論。
---------------------
推
04/25 00:01,
04/25 00:01
這句推文確實為不當之處,原因是 T 大所說,
原 po 要的是較像 formview,而不是 dialog。
但若要 dialog 時,win32 下呼叫 CreateDialog 也沒錯。
< dialog 並非只能由 rc 產生 >
推
04/25 02:11,
04/25 02:11
→
04/25 02:11,
04/25 02:11
→
04/25 02:12,
04/25 02:12
→
04/25 02:13,
04/25 02:13
上面這四句,我指的是這種作法。
#define BTN_ID 1001
LRESULT CALLBACK WindowProcedure(
HWND hwnd,UINT msg,
WPARAM wParam,LPARAM lParam)
{
static HWND hbtn;
switch(msg) {
case WM_CREATE: {
hbtn = CreateWindow( "Button", "Some Text",
WS_CHILD | WS_VISIBLE | WS_PUSHBUTTON,
0, 0, 100, 20, hwnd, (HMENU)BTN_ID,
( (LPCREATESTRUCT)lParam ) -> hInstance, NULL);
return 0;
break;
}
case WM_COMMAND : {
if (LOWARD(wParam)==BTN_ID &&
HIWORD(wParam)==BN_CLICKED &&
(HWND)lParam == hbtn ) {
/* some function for button click. */
}
}
}
}
Charles Petzold 書中也用了很多這手法。
< 畫出來很醜,因為沒再針對 buttion 做 draw 之動作 >
此概念也感謝 T 大指出是 Child Window, 無誤。
至於 p 大所言較適用另一種情境。
推
04/25 02:20,
04/25 02:20
→
04/25 02:21,
04/25 02:21
推
04/25 04:37,
04/25 04:37
→
04/25 04:38,
04/25 04:38
是在 client area 下按右鍵,會有 pop-up menu 彈出,
故小弟認為他的見解似乎也是無誤 <專門考慮他原意,所言是無誤>。
推
04/25 02:50,
04/25 02:50
推
04/25 12:10,
04/25 12:10
推
04/25 23:12,
04/25 23:12
這本書目前應還沒絕版,目前出到 5e,
這也是我所納悶 f 大剛開始指的是哪本絕版書
< 我能想到的就只有深入淺出 MFC, 但, 想不透與 Win32 API 有何關聯 ? >
推
04/25 23:36,
04/25 23:36
→
04/25 23:38,
04/25 23:38
→
04/25 23:39,
04/25 23:39
推
04/25 23:49,
04/25 23:49
→
04/25 23:49,
04/25 23:49
→
04/25 23:51,
04/25 23:51
Win32 怎麼搞 FormView ? 我不知道,因沒去拆 CFormView class 出來看,
VC FormView 其中一個好處是,可以在 IDE 下拉子控制,
但 Win32 裡面辦不到,要做到像 MFC FormView ,上述範例碼是一種方式,
拿掉 IDE support 後,還可以做到像 FormView 拉拉就好之功能嗎?
保留,扣除掉我所知的奇淫怪技 (如無邊框dialog),至少我認為沒辦法。
至於 CDialog 與 CreateDialog 的確是完全兩碼不同的事,
但從沒人提起 CDialog 這回事 < 本來就基於 Win32 討論,所以應沒提到這>。
我書確實沒看得很多又很精,所以若我有說錯的話,
可以直接舉出哪裡有問題沒關係,小弟願虛心接受與感謝。
------------------------------------
來一點原 po 看得懂的東西。
在想東想西前,版上所 po 的這本書
Programming Windows,Fifth Edition (Charles Petzold ,有繁譯)
這本確實是聖經,但若自認為數學沒很好
<關數學什麼事?別懷疑了,這本書內容很多是在 ”算”繪圖的東西,
有時對初學者而言反而弄不清程式碼重點在哪,但個人覺得 code 寫得算漂亮 >
先從 theForger's Win32 API Tutorial(有繁譯,但較習慣原文) 這份資源下手也無妨。
裡面用的範例都很簡單,這本若耐不下心看完的話,就更惶論 Charles 聖經本。
但 Charles Petzold 這本確實該細讀一次,有興趣再挑戰其他 Win32 的話
Programming Applications for Microsoft Windows (Charles Petzold)
這本提的東西相信讓不少人會感興趣。
無論如何,Win32 先耐心看完一遍,不要跳東跳西。
看完一遍後,要搞子控制會發現有幾個重點
1. Win32 子控制只有 Button、ComboBox、Edit、ListBox、
ScrollBar、Static。
其他在 commctrl.h 裡面的 < 如 progress bar > 就不贅述。
其他要特殊效果的,像是 ImageButton、ListCheckBox 等,
這個要基於已有子控制,再自己往外寫出去。
< 當然有人已經包好了,只要找到、會用就行。 >
2. 要生成子控制有三個方法,第一種是用 IDE 幫忙拉 ,
這東西統稱叫 Resource Editor,VC 裡是已經符在裡面了,
還有其他的 Resource Editor 可用,但猜你沒興趣知道。
3. 第二種方式是直接寫 .rc 檔案,像是你的 menu 說是在 WM_CREATE 的時候
自己做 attach ,但這裡可以直接寫個像 script language 的東西出來。
< 就是 .rc >
4. 第三種方式便是使用相關 API,如
CreateWindow、CreateMenu、CreateDialog 等方式。
5. 部份資源 ID,可在填寫 struct WNDCLASS / WNDCLASSEX 時就順便給它,
詳細可去 msdn 查 CreateWindow 與 struct WNDCLASSEX 之說明。
至於其他的,自己再細思吧。
< 註,英文不好真的是多看,上來問大家也是給你 msdn 上去 k 英文。>
--
「自從我學了 C# , 人都變聰明 , 考試都考一百分」
「自從我學了 VB , 皮膚都變好 , 人也變漂亮了 」
「自從我學了 Java , 明顯變壯 , 個子也變高了 」
「自從我學了 C++ , 內分泌失調 , 頭都禿了... 」
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 180.177.76.161
推
05/01 20:22, , 1F
05/01 20:22, 1F
討論串 (同標題文章)
完整討論串 (本文為第 2 之 3 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章