推 EdisonX:何不直接 CreateDialog 就好了?就不要CreateWindow.04/25 00:01
這句推文確實為不當之處,原因是 T 大所說,
原 po 要的是較像 formview,而不是 dialog。
但若要 dialog 時,win32 下呼叫 CreateDialog 也沒錯。
< dialog 並非只能由 rc 產生 >
推 EdisonX:耶..p大說的確實是大多情形,是有種做到像MFC-CFormView.04/25 02:11
→ EdisonX:像是在WM_CREATE時再做一次CreateWindow("Button"...),消04/25 02:11
→ EdisonX:息訊息用WM_COMMAND / (HWND)lParam==hBtn 方式判斷.04/25 02:12
→ EdisonX:< 是有點麻煩,重點是畫出來蠻醜的 Orz > 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 大所言較適用另一種情境。
推 purpose:觀點不同,這樣 CreateWindow 出來的按鈕,我是看成剛好在04/25 02:20
→ purpose:主視窗上空建的另一個視窗,不看成裡面的東西04/25 02:21
推 purpose:我前面文中描述的 CreateWindow 只考慮到 04/25 04:37
→ purpose:WS_POPUP 特性,此時建出來的按鈕其主視窗只是 Owner 位置 04/25 04:38
是在 client area 下按右鍵,會有 pop-up menu 彈出,
故小弟認為他的見解似乎也是無誤 <專門考慮他原意,所言是無誤>。
推 fanntone:你絕版書看不夠熟喔XD04/25 02:50
推 fanntone:gozha大貼的就是我講的絕版書 還有你搞錯了WindowsAPI和 04/25 23:12
這本書目前應還沒絕版,目前出到 5e,
這也是我所納悶 f 大剛開始指的是哪本絕版書
< 我能想到的就只有深入淺出 MFC, 但, 想不透與 Win32 API 有何關聯 ? >
推 fanntone:T大說的沒錯 這兩種情況不一樣,所以在創專案時特別分成 04/25 23:36
→ fanntone:consloe Dialog Formview這三種(VC6) 04/25 23:38
→ fanntone:所以不能都摻在一起阿!! 04/25 23:39
推 fanntone:至於你說的要怎麼去改屬性在裡面放東西 這書上很明確說了 04/25 23:49
→ fanntone:創建好的時候就決定好了 不能更改~ 04/25 23:49
→ fanntone:以上我講的都是MFC ,WindowsAPI怎麼搞要再找資料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
推 yoll522:感謝回應,這幾天一直有在網路學api,所以比這晚發現這篇 05/01 20:22