Setparent函数用法技巧

SetParent是一个API函数,它的作用是为一个物体指定一个新的父窗体。(父窗体严格来说应该是容器,我是这么理解的).也就是把一个物体转到另一个物体上去 

Setparent 的用法相当简单 

语法是: 
Setparent  物体句柄,目标句柄 

不过要想使它真正有实用价值却需要一定的知识及技巧. 

比如你把一个按钮放到另一个窗体上(另一个窗体可以是其他程序中的): 

setparent command1.hwnd,&hxxxxx'( 假设&hxxxxx是另一个窗体的句柄值) 


那么你会发现,你点击那个放在桌面上的按钮将不会执行原本command_click事件中的任何代码了! 

要解决的方法是多种多样的 

假如你只是想让它执行代码,并不想进一步了解WIN的消息运作机制,那么我建议你把这个按钮放进一个容器,比如picturebox,或是farme,再把这个容器转到另一个窗体上去.而不是把按钮转到窗体上.那么这个按钮就会执行原本clic中的代码了.只要调整容器的大小与按钮大小一样,那么感觉外观上是看不出来有容器存在的. 

假如你想了解WIN的消息运作机制,那么我建议你使用子类来解决这一问题. 
在这得先说简单说明一下WIN的消息机制运作,简单的说就是"以事件为基础,以消息驱动" 

其实WIN是不认事件的.所谓的"事件"只是一些开发环境为了简化开发者的代码编写量而把一大堆系列的消息封装而成的.作个形象的比喻:假如存在一个"吃饭"的事件.那么其中就应该包括"端碗"\"拿筷子"\"把饭挑进嘴里"\"放碗"\"放筷子"等几个消息.我们就会处理这一系列的消息而把它归结为一个事件的完成. 

我先简单说明一下一个按钮单击事件发生时会发生哪些消息:(因为发生的消息太多,只说出重要的几条:) 
首先,鼠标向按钮点下时,系统就向按钮发送一个鼠标左键点下的消息,同时再向它发送一条物体风格改变的消息(使按钮的状态为凹下).再发送一条重画物体的消息(改变原有的凸起外观,使按钮画成凹下的外观).这样我们就看到了按钮被鼠标左键点下时的样子。然后再发送鼠标左键抬起的消息,(中间可能会发生鼠标移动的消息,但是我们可以不管它),继续接着发送物体风格改变的消息(使按钮状态为凸起,也就是回复正常),再接着发送一个按钮重画的消息。到最后,按钮再向所在的容器发送一条命令消息作为点击事件的终结,即点击成功。(在其中鼠标被抬起的消息中,有一些消息带的参数是用以判断鼠标是否正处于按钮区域坐标内的。这个我们暂时也可以不必理会) 

在上面的消息中,你可以随意截取一个消息作为判断按钮是否被点下,比如截下鼠标左键点下wm_lbuttondown消息,也可以截下wm_lbuttonup弹起消息,其中再用API来取得弹起时的鼠标坐标,就能知道它是否被点击了。 

不过直接判断按钮在最后点击完毕时发送出去的那条消息却可以直接判断出按钮是否被点击!即wm_command消息 
但这条消息因为不是系统发送给按钮的,而是由按钮发送给系统的,所以许多人会忽略,因为许多人都已经习惯于控制按钮只对按钮拦截消息,但因为子类只能拦截物体得到的消息而不能拦截物体发送的消息,所以这条wm_command消息用得并不是很多。 

所以我们只需要对它的容器进行这条消息的拦截就能得知它是否被点击了! 

如:setparent command1.hwnd,&hxxxxx'( 假设&hxxxxx是另一个窗体的句柄值) 

那我们只需要对“&hxxxxx”进行消息拦截,当发现得到wm_command消息时,判断它的wprarm参数及lprarm参数,假如wprarm参数不为0,且lprarm为command1.hwnd时,那我们就知道,command1被点击了.通过判断lprarm还可以判断其他的按钮是否被点击!这样我们就能一次性放上多个按钮了,再对多个按钮进行判断是哪个被点击. 



注意:按钮结束后发送的消息不是发送给它的窗体,而是发送给它的容器! 
我曾见过一个高手因为不知道这一点而只对它的窗体进行这条消息的拦截,结果抱怨说老是拦不到而造成一个功能无法实现.
所以应该先判断这个按钮所处的容器.一般情况下,指定的新父窗体就是容器了. 


还有,向物体的容器拦截一些命令消息如wm_command消息应用得很广泛. 
比如说用API新添了一些菜单,需要让这些菜单执行操作,就需要拦截窗体的wm_syscmd(我一下也忘了这个还是wm_syscommand).再通过判断它后面的两个参数值就可以让它执行相应的操作了.因为菜单不可能放入PICTUREBOX之类的容器里,所以一般只截窗体的消息即可.
WINAPI,WinAPI手册,最全的WINAPI函数手册,WINAPI开发必备 目录 1 内容简介 14 前言 14 第一章 Win32 API概论 14 为什么使用 Wiu32 API 14 Win32 API 简介 15 第二章 窗口管理函数 16 第一节 易用特性函数(Accessibility Features) 20 SoundSentryProc 20 SystemParametersinfo 21 第二节 按钮函数(Button) 34 CheckDlgButton 34 CheckRadioButton 34 IsDlgButtonChecked 35 第三节 插入标记(^)函数(Caret) 36 CreateCaret 36 DestroyCaret 37 GetCaretBlinkTime 37 GetCaretPos 38 HideCaret 38 SetCaretBlinkTime 39 SetCaretPos 39 ShowCaret 40 第四节 组合框函数(Combo box) 40 CCHookProc 40 CFHookProc 42 ChooseColor 43 ChooseFont 44 CommDlgExtendedEorror 45 DlgDirListComboBox 47 DlgDirSelectEx 49 DlgDirSelectComboBoxEx 50 FindText 50 FRHookProc 51 GetFileTitle 52 GetOpenFileName 53 GetSaveFileName 54 OFNGookProc 54 OFNHookProcOldStyle 56 PagePaintHook 57 PageSetupDlg 58 pageSetupHook 58 PrintDlg 59 PrintdlgEx 60 PrintHookProc 61 ReplaceText 62 SetupHookProc 63 第五节 标函数(Cursor) 64 ClipCursor 64 CopyCursor 65 CreateCursor 65 DestroyCursor 66 GetClipCursor 67 GetCursor 67 GetCursorpos 67 LoadCursorFromFile 68 SetCursor 68 SetCursorPos 69 SetSystemCursor 69 ShowCursor 70 LoadCursor 71 第六节 对话框函数(Dialog Box) 72 CreateDialog 72 CreateDialoglndirect 73 CreateDialoglndirectParam 74 CreateDialogParam 76 DefDlgProc 77 DialogBox 78 DialogBoxlndirect 79 DialogBoxlndirectParam 80 DialogBoxParam 81 DialogProc 82 EndDialog 83 GetDialogBaseUnits 83 GetDigCtrllD 84 GetDigltem 85 GetDlgltemlnt 85 GetDlgltemText 86 GetNextDlgGroupltem 87 GetNexTDlgTabltem 88 IsDialogMessage 88 MapDialogRect 89 MessageBox 90 MessageBoxEx 93 SendDlgltemMessage 94 SetDlgltemlnt 95 SetDlgltemText 95 MessageBoxlndirect 96 第七节 编辑控制函数(Edit Control) 97 EditWordBreakproc 97 第八节 图标函数(Icon) 98 Copylcon 98 Createlcon 99 CreatelconFromResource 100 CreatelconFromResourceEx 101 Destroylcon 102 Create_cpm_mdorect_ZIWe 102 Drawlcon 103 DrawlconEx 104 ExtractAssociatedlcon 105 Extractlcon 106 ExtractlconEx 106 Getlconlnfo 107 LookuplconldFromDirectory 108 LookuplconldFrom 109 Loadlcon 110 第九节 键盘加速器函数(Keyboard Accelerator) 110 CopyAcceleratorTable 111 CreateAcceleratorTable 111 DestroyAcceleratorTable 112 LoadAccelerators 112 TranslateAccelerator 113 第十节 键盘输入函数(Keyboard Input) 114 ActivateKeyboadLayout 114 EnableWindow 115 GetActiveWindows 116 GetAsyncKeyState 116 GetFocus 117 GetKBCodePage 118 GetKeyboardLayout 118 GetKeyboardLayoutList 118 GetKeyboardLayoutName 119 GetKeyboardState 119 GetKeyNameText 120 GetKeyState 121 IsWindowEnabled 122 keybd_event 122 LoadKeyboardLayout 123 MapVirtualKey 124 MapVlrtualKeyEx 126 OemKeyScan 126 RegisterHotKey 127 SetActiveWindow 128 SetFocus 129 SetKeyboardState 130 ToAscii 130 ToAsciiCxToAsciiCx 131 ToUnicode 132 ToUnicodeEx 133 UnloadKeyboardL 134 UnreglsterHotKey 134 VkKeyScan 135 vkKeyScanEx 136 第十一节 列表框函数(List boX) 136 DlgDirList 136 DlgDirSelectEx(2) 137 第十二节 菜单函数(Menu) 138 CheckMenuRadlol 138 CreateMenu 139 CreatePopupMenu 140 DeleteMenu 140 DestroyMenu 141 DrawMenuBar 141 EnableMenultem 142 GetMenu 143 GetMenuDefaultltem 143 GetMenultemlD 144 GetMenultemlnfo 144 GetMenultemRect 145 getSubMenu 145 GetSystemMenu 146 HlllteMenultem 147 InsertMenultem 147 IsMenu 148 LoadMenu 149 LoadMenulndirect 149 MenultemFromPo 150 RemoveMenu 150 SetMenu 151 SetMenuDefaultltem 151 SetMenultemBitm 152 SetMenultemlnfo 153 TrackPopupMenu 154 TrackPopupMenuEx 155 AppendMenu 156 CheckMenultem 159 GetMenuCheckMarkDimensions 159 GetMenuState 160 GetMenuString 161 InsertMenu 161 ModifyMenu 163 第十三节 消息和消息总队列函数(Message and Message Queue) 165 BroadcastSystemMessage 165 DispatchMessage 166 GetlnputState 167 GetMessage 167 GetMessageExtralnfo 168 GetMessagePos 168 GetMessageTime 169 GetQueueStatus 170 InSendMessage 171 InSendMessageEx 171 PeekMessage 172 PostMessage 173 PostQuitMessage 174 PostThreadMessage 175 RegisterWindowsMessage 176 ReplyMessage 176 SendAsyncProc 177 SendMessage 178 SendMessageCallback 178 SendMessageTImeout 179 SendNotifyMessage 181 SendMessageExtralnfo 181 TranslateMessage 182 WaltMessage 183 PostAppMessage 183 SetMessageQueue 183 第十四节 鼠标输入函数(Mouse Input) 183 DragDetect 183 GetCapture 184 GetDoubleCllckTime 184 GetMouseMovePoints 185 mouse_event 186 ReleaseCapture 188 SetCapture 188 SetDoubleCllckTime 189 SwapMouseButton 189 TrackMouseEvent 190 第十五节 多文档接口函数(Multiple Document Interface) 191 CreateMDIWindow 191 DefFrameProc 192 DefMDIChildProc 193 TranslateMdISysAccel 194 第十六节 资源函数(Resource) 195 BeginUpdateResource 195 CopyImage 195 EndUpdateResource 197 EnumResLangProc 197 EnumResNameProc 198 EnumResourceLanguages 199 EnumResourceNames 200 EnumResourceTypes 200 EnumResTypeProc 201 FlndResource 202 FindResourceEx 203 LoadImage 204 LoadResource 206 LockResource 207 SlzeofResource 207 UpdateResource 208 FreeResource 209 UnlockResource 209 第十七节 滚动条函数(Scroll Bar) 209 EnableScrollBar 209 GetScrolllnfo 210 ScrollDC 211 ScrollWindowEx 212 SetScrolllnfo 214 ShowScrollBar 215 GetScrollPos 215 GetScrollRange 216 ScrollWindow 217 SetScrollPos 218 SetScrollRange 219 第十八节 窗口函数(Window) 220 AdlustWindowRect 220 AdjustWindowRectEx 221 AnImateWindow 222 ArrangelconlcWindows 223 BeginDeferWindowPos 223 BromgWindowToTop 224 CascadeWindows 225 ChildWindowFromaPoint 225 ChildWindowFromaPointEx 226 CloseWindow 227 Create Window 227 CreateWindowEx 233 DeferWindowPos 235 DestroyWindow 238 EnableWindow 238 EndDeferWindowPos 239 EnumChildProc 240 EnumTreadWindows 240 EnumThreadWndProc 241 EnumWindows 241 EnumWindowsProc 242 FindWindow 243 FlndWindowEx 243 GetClientRect 244 GetDesktopWindow 244 GetForegroundWindow 245 GetLastActivePopup 245 GetNextWindow 246 GetParent 246 GetTopWindow 247 GetWindow 247 GetWindowPlacement 248 GetWindowRect 249 GetWindowText 249 IsChild 250 GetWindowTextLength 251 GetWlndowThreadprocessld 251 IsIconic 252 IsWindow 252 IsWindowUnicode 253 IsWindowVlslble 253 IsZoomed 254 MoveWindow 254 Openlcon 255 SetForegroundWindow 255 SetParent 256 SetWindowLong 256 SetWindowPlacement 259 SetWindowPos 260 SetWindowText 263 ShowOwnedPopups 263 ShowWindow 264 ShowWindowAsync 265 TileWindows 266 WindowFromPoint 267 WinMain 267 AnyPopup 269 EnumTaskWindows 269 GetSysModalWindow 269 GetWindowTask 269 SetSysModalWindow 269 第十九节 窗口类函数(Window Class) 270 GetClasslnfoEx 270 GetClassLong 270 GetClassName 271 GetWindowLong 272 RegisterClassEx 273 SetClassLong 274 SetWindowLong 275 GetClasslnfoEx 278 GetClassWord 279 GetWindowWord 279 RegisterClass 279 SetClassWord 280 SetWindowWord 281 第二十节 窗口过程函数(Window Procedure) 281 CallWindowProc 281 DefWindowProc 282 WindowProc 283 第二十一节 窗口属性函数(Window Property) 284 EnumProps 284 EnumPropsEx 284 GetProp 285 PropEnumProcEx 285 RemoveProp 286 SetProp 287
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值