看板 C_and_CPP 關於我們 聯絡資訊
為避免誤會愈積愈深,回個文。 另我知一直重覆引用、針對推文者的每句話做過度解讀是不禮貌之事, 唯此篇我認為只有這麼做,才可撥雲見日, 若有得罪,先行道歉。 同時認為有必要讓原 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的方式拉出來嗎? : 謝謝 上面的問題或許晚些解答好點。 接下來是一長串誤會的討論。 ---------------------
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