国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
什么是VB進行子類化及簡單介紹

目錄

  • 何謂子類化(subclassing)
  • Visual Basic 6子類化的實現(xiàn)
  • Visual Basic .NET子類化的實現(xiàn)
  • 小結(jié)

1. 何謂子類化(subclassing) 

  眾所周知,Windows是一個基于消息的系統(tǒng),消息在Windows的對象之間進行著傳遞。子類化和Windows的鉤子機制存在于消息系統(tǒng)之中,我們可以利用這些機制來操縱、修改甚至丟棄那些在操作系統(tǒng)或是進程中傳遞的消息,以求改變系統(tǒng)的一些行為。子類化技術(shù)用來截取窗口或控件之間的消息,當然是消息在到達目的窗口之前完成的操作。這些被截獲的消息既可以保留也可以修改它們的狀態(tài),之后就繼續(xù)發(fā)送到目的地。子類化技術(shù)實現(xiàn)了一些正常情況下無法實現(xiàn)的功能,試想鼠標右鍵單擊TextBox,系統(tǒng)默認彈出Undo、Cut、Copy、Paste等菜單,我們就可以利用子類化技術(shù)來改變這個系統(tǒng)菜單。 

  簡單的說,子類化就是創(chuàng)建一個新的窗口消息處理過程,并將其插入到原先的默認窗口消息處理過程之前。 

  子類化分為三類:實例子類化(instance subclassing)—從窗口或控件的單一實例截獲消息,這種子類化技術(shù)最普遍;全局子類化(global subclassing)—能夠截獲從相同的窗口類創(chuàng)建出來的多個窗口或控件的消息;超類化(superclassing)—和全局子類化很類似,區(qū)別在于可以應用在新的窗口類上面。 

2. Visual Basic 6子類化的實現(xiàn) 

  在Visual Basic 6子類化的實現(xiàn)中我將通過一段代碼的實例來介紹這一技術(shù)在VB6中的應用?,F(xiàn)在很多開發(fā)社區(qū)中經(jīng)常談到的一個話題就是界面開發(fā)如何Skin,這種技術(shù)有很多解決方式,如使用可以貼圖的控件或使用第三方開發(fā)的換膚ActiveX控件。其實Skin技術(shù)需要處理的是WM_DRAWITEM、WM_MEASUREITEM、WM_NCPAINT消息,這些消息的主要用途就是可以重畫控件和窗口的非客戶區(qū)。想要對這些VB6無法處理的消息進行編程就必須用到子類化,這些消息都會被發(fā)送到能夠自繪的控件的窗口上,因此下面的例子就是利用窗口子類化來重畫Button控件。 

①創(chuàng)建工程 

  啟動Visual Basic 6同時創(chuàng)建一個標準EXE工程。 

②窗口布局 

  在FORM1上放置3個Button控件,并將前兩個Button的Style屬性設置為1-Graphical,因為只有Style屬性設置為Graphical的Button才可以Owner-drawn。 


③在窗體中錄入代碼

  1. 代碼  
  2.   
  3. Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->Private Sub Command3_Click()   
  4.   
  5. '通過Enabled屬性的控制,來顯示重畫控件在Unenabled狀態(tài)時的效果   
  6. If Command1.Enabled Then   
  7.   
  8. Command1.Enabled = False   
  9.   
  10. Else   
  11.   
  12. Command1.Enabled = True   
  13.   
  14. End If   
  15.   
  16. End Sub   
  17.   
  18. Private Sub Form_Load()   
  19.   
  20. '安裝子類化入口   
  21. Call Init(Me.hWnd)   
  22.   
  23. End Sub   
  24.   
  25. Private Sub Form_Unload(Cancel As Integer)   
  26.   
  27. '卸載子類化   
  28. Call Terminate(Me.hWnd)   
  29.   
  30. End Sub  
  31. ④加入一個模塊并錄入代碼   
  32. Option Explicit  
  33.   
  34. ' -- 引用Win32Api –  
  35. '得到默認的窗口消息處理過程的地址需要的API  
  36.   
  37. Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long  
  38.   
  39. '設置一個新的窗口消息處理過程的地址需要的API  
  40.   
  41. Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long  
  42.   
  43. '給指定的窗口消息處理過程傳遞消息需要的API  
  44.   
  45. Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long  
  46.   
  47. '內(nèi)存拷貝  
  48.   
  49. Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)  
  50.   
  51. Const GWL_WNDPROC = (-4&)  
  52.   
  53. Dim PrevWndProc&  
  54.   
  55. Private Const WM_DESTROY = &H2  
  56.   
  57. Private Const WM_DRAWITEM = &H2B  
  58.   
  59. Private Type RECT  
  60.   
  61.  Left As Long  
  62.    
  63.  Top As Long  
  64.    
  65.  Right As Long  
  66.    
  67.  Bottom As Long  
  68.   
  69. End Type  
  70.   
  71. 'WM_DRAWITEM需要處理的結(jié)構(gòu)體  
  72.   
  73. Private Type DRAWITEMSTRUCT  
  74.   
  75. CtlType As Long  
  76.   
  77. CtlID As Long  
  78.   
  79. itemID As Long  
  80.   
  81. itemAction As Long  
  82.   
  83. itemState As Long  
  84.   
  85. hwndItem As Long  
  86.   
  87. hdc As Long  
  88.   
  89. rcItem As RECT  
  90.   
  91. itemData As Long  
  92.   
  93. End Type  
  94.   
  95. ' Owner draw 常量  
  96.   
  97. Private Const ODT_BUTTON = 4  
  98.   
  99. ' Owner draw 動作  
  100.   
  101. Private Const ODA_DRAWENTIRE = &H1  
  102.   
  103. Private Const ODA_SELECT = &H2  
  104.   
  105. Private Const ODA_FOCUS = &H4  
  106.   
  107. ' Owner draw 狀態(tài)  
  108.   
  109. Private Const ODS_SELECTED = &H1  
  110.   
  111. Private Const ODS_GRAYED = &H2  
  112.   
  113. Private Const ODS_DISABLED = &H4  
  114.   
  115. Private Const ODS_CHECKED = &H8  
  116.   
  117. Private Const ODS_FOCUS = &H10  
  118.   
  119. '得到指定窗口的文本  
  120.   
  121. Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long  
  122.   
  123. 'GDI相關API函數(shù),重畫Button時使用  
  124.   
  125. Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long  
  126.   
  127. Private Declare Function CreateSolidBrush Lib "gdi32" (ByVal crColor As Long) As Long  
  128.   
  129. Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long  
  130.   
  131. Private Declare Function GetSysColor Lib "user32" (ByVal nIndex As Long) As Long  
  132.   
  133. '色彩常量  
  134.   
  135. Const COLOR_SCROLLBAR = 0  
  136.   
  137. Const COLOR_BACKGROUND = 1  
  138.   
  139. Const COLOR_ACTIVECAPTION = 2  
  140.   
  141. Const COLOR_INACTIVECAPTION = 3  
  142.   
  143. Const COLOR_MENU = 4  
  144.   
  145. Const COLOR_WINDOW = 5  
  146.   
  147. Const COLOR_WINDOWFRAME = 6  
  148.   
  149. Const COLOR_MENUTEXT = 7  
  150.   
  151. Const COLOR_WINDOWTEXT = 8  
  152.   
  153. Const COLOR_CAPTIONTEXT = 9  
  154.   
  155. Const COLOR_ACTIVEBORDER = 10  
  156.   
  157. Const COLOR_INACTIVEBORDER = 11  
  158.   
  159. Const COLOR_APPWORKSPACE = 12  
  160.   
  161. Const COLOR_HIGHLIGHT = 13  
  162.   
  163. Const COLOR_HIGHLIGHTTEXT = 14  
  164.   
  165. Const COLOR_BTNFACE = 15  
  166.   
  167. Const COLOR_BTNSHADOW = 16  
  168.   
  169. Const COLOR_GRAYTEXT = 17  
  170.   
  171. Const COLOR_BTNTEXT = 18  
  172.   
  173. Const COLOR_INACTIVECAPTIONTEXT = 19  
  174.   
  175. Const COLOR_BTNHIGHLIGHT = 20  
  176.   
  177. Private Declare Function FillRect Lib "user32" (ByVal hdc As Long, lpRect As RECT, ByVal hBrush As Long) As Long  
  178.   
  179. Private Declare Function FrameRect Lib "user32" (ByVal hdc As Long, lpRect As RECT, ByVal hBrush As Long) As Long  
  180.   
  181. Private Declare Function CreatePen Lib "gdi32" (ByVal nPenStyle As Long, ByVal nWidth As Long, ByVal crColor As Long) As Long  
  182.   
  183. '畫筆格式  
  184.   
  185. Const PS_SOLID = 0  
  186.   
  187. Const PS_DASH = 1 ' -------  
  188.   
  189. Const PS_DOT = 2 ' .......  
  190.   
  191. Const PS_DASHDOT = 3 ' _._._._  
  192.   
  193. Const PS_DASHDOTDOT = 4 ' _.._.._  
  194.   
  195. Const PS_NULL = 5  
  196.   
  197. Const PS_INSIDEFRAME = 6  
  198.   
  199. Const PS_USERSTYLE = 7  
  200.   
  201. Const PS_ALTERNATE = 8  
  202.   
  203. Const PS_STYLE_MASK = &HF  
  204.   
  205. Private Declare Function MoveToEx Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, lpPoint As POINTAPI) As Long  
  206.   
  207. Private Declare Function LineTo Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long  
  208.   
  209. Private Type POINTAPI  
  210.   
  211.  x As Long  
  212.    
  213.  y As Long  
  214.   
  215. End Type  
  216.   
  217. Private Declare Function DrawText Lib "user32" Alias "DrawTextA" (ByVal hdc As Long, ByVal lpStr As String, ByVal nCount As Long, lpRect As RECT, ByVal wFormat As Long) As Long  
  218.   
  219. Private Const DT_SINGLELINE = &H20  
  220.   
  221. Private Const DT_CENTER = &H1  
  222.   
  223. Private Const DT_VCENTER = &H4  
  224.   
  225. Private Declare Function SetTextColor Lib "gdi32" (ByVal hdc As Long, ByVal crColor As Long) As Long  
  226.   
  227. Private Declare Function SetBkMode Lib "gdi32" (ByVal hdc As Long, ByVal nBkMode As Long) As Long  
  228.   
  229. Private Const TRANSPARENT = 1  
  230.   
  231. ' – 聲明結(jié)束 --  
  232.   
  233. Private Sub DrawButton(ByVal hWnd As Long, ByVal hdc As Long, rct As RECT, ByVal nState As Long)  
  234.   
  235.  Dim P As POINTAPI  
  236.    
  237.  Dim s As String  
  238.    
  239.  Dim hbr As Long  
  240.    
  241.  Dim hpen As Long  
  242.    
  243.    
  244.    
  245.  hbr = CreateSolidBrush(GetSysColor(COLOR_BTNFACE)) 'RGB(231, 231, 231)  
  246.    
  247.  SelectObject hdc, hbr  
  248.    
  249.  FillRect hdc, rct, hbr  
  250.    
  251.  DeleteObject hbr  
  252.    
  253.    
  254.    
  255.  '畫文字時背景為透明狀  
  256.    
  257.  SetBkMode hdc, TRANSPARENT  
  258.    
  259.  '得到Button的Caption  
  260.    
  261.  s = String$(255, " ")  
  262.    
  263.  GetWindowText hWnd, s, 255  
  264.    
  265.  s = Trim$(s)  
  266.    
  267.  '根據(jù)Button的Enabled狀態(tài)進行重畫  
  268.    
  269.  If (nState And ODS_DISABLED) = ODS_DISABLED Then  
  270.    
  271.  '畫外圍灰框  
  272.    
  273.  hbr = CreateSolidBrush(RGB(132, 130, 132))  
  274.    
  275.  SelectObject hdc, hbr  
  276.    
  277.  FrameRect hdc, rct, hbr  
  278.    
  279.  DeleteObject hbr  
  280.    
  281.  '畫內(nèi)側(cè)3D效果->亮色  
  282.    
  283.  hpen = CreatePen(PS_SOLID, 1, RGB(255, 255, 255))  
  284.    
  285.  SelectObject hdc, hpen  
  286.    
  287.  MoveToEx hdc, rct.Left + 1, rct.Top + 1, P  
  288.    
  289.  LineTo hdc, rct.Right - 1, rct.Top + 1  
  290.    
  291.  MoveToEx hdc, rct.Left + 1, rct.Top + 1, P  
  292.    
  293.  LineTo hdc, rct.Left + 1, rct.Bottom - 1  
  294.    
  295.  DeleteObject hpen  
  296.    
  297.  '畫內(nèi)側(cè)3D效果->暗色  
  298.    
  299.  hpen = CreatePen(PS_SOLID, 1, RGB(189, 190, 189))  
  300.    
  301.  SelectObject hdc, hpen  
  302.    
  303.  MoveToEx hdc, rct.Left + 1, rct.Bottom - 2, P  
  304.    
  305.  LineTo hdc, rct.Right - 1, rct.Bottom - 2  
  306.    
  307.  MoveToEx hdc, rct.Right - 2, rct.Top + 1, P  
  308.    
  309.  LineTo hdc, rct.Right - 2, rct.Bottom - 1  
  310.    
  311.  DeleteObject hpen  
  312.    
  313.  '畫陰影文字  
  314.    
  315.  rct.Left = rct.Left + 1  
  316.    
  317.  rct.Right = rct.Right + 1  
  318.    
  319.  rct.Bottom = rct.Bottom + 1  
  320.    
  321.  rct.Top = rct.Top + 1  
  322.    
  323.  SetTextColor hdc, GetSysColor(COLOR_BTNHIGHLIGHT)  
  324.    
  325.  DrawText hdc, s, LenB(StrConv(s, vbFromUnicode)), rct, DT_CENTER Or DT_SINGLELINE Or DT_VCENTER  
  326.    
  327.  rct.Left = rct.Left - 1  
  328.    
  329.  rct.Right = rct.Right - 1  
  330.    
  331.  rct.Bottom = rct.Bottom - 1  
  332.    
  333.  rct.Top = rct.Top - 1  
  334.    
  335.  SetTextColor hdc, GetSysColor(COLOR_GRAYTEXT)  
  336.    
  337.  DrawText hdc, s, LenB(StrConv(s, vbFromUnicode)), rct, DT_CENTER Or DT_SINGLELINE Or DT_VCENTER  
  338.    
  339.  Exit Sub  
  340.    
  341.  End If  
  342.    
  343.  '按下Button時重畫  
  344.    
  345.  If (nState And ODS_SELECTED) = ODS_SELECTED Then  
  346.    
  347.  '畫內(nèi)部區(qū)域顏色  
  348.    
  349.  hbr = CreateSolidBrush(RGB(156, 186, 222))  
  350.    
  351.  SelectObject hdc, hbr  
  352.    
  353.  FillRect hdc, rct, hbr  
  354.    
  355.  DeleteObject hbr  
  356.    
  357.  '畫外圍灰框  
  358.    
  359.  hbr = CreateSolidBrush(RGB(99, 125, 165))  
  360.    
  361.  SelectObject hdc, hbr  
  362.    
  363.  FrameRect hdc, rct, hbr  
  364.    
  365.  DeleteObject hbr  
  366.    
  367.  '畫內(nèi)側(cè)3D效果->亮色  
  368.    
  369.  hpen = CreatePen(PS_SOLID, 1, RGB(123, 158, 206))  
  370.    
  371.  SelectObject hdc, hpen  
  372.    
  373.  MoveToEx hdc, rct.Left + 1, rct.Top + 1, P  
  374.    
  375.  LineTo hdc, rct.Right - 1, rct.Top + 1  
  376.    
  377.  MoveToEx hdc, rct.Left + 1, rct.Top + 1, P  
  378.    
  379.  LineTo hdc, rct.Left + 1, rct.Bottom - 1  
  380.    
  381.  DeleteObject hpen  
  382.    
  383.  '畫內(nèi)側(cè)3D效果->暗色  
  384.    
  385.  hpen = CreatePen(PS_SOLID, 1, RGB(181, 203, 231))  
  386.    
  387.  SelectObject hdc, hpen  
  388.    
  389.  MoveToEx hdc, rct.Left + 1, rct.Bottom - 2, P  
  390.    
  391.  LineTo hdc, rct.Right - 1, rct.Bottom - 2  
  392.    
  393.  MoveToEx hdc, rct.Right - 2, rct.Top + 1, P  
  394.    
  395.  LineTo hdc, rct.Right - 2, rct.Bottom - 1  
  396.    
  397.  DeleteObject hpen  
  398.    
  399.    
  400.    
  401.  rct.Left = rct.Left + 1  
  402.    
  403.  rct.Right = rct.Right + 1  
  404.    
  405.  rct.Bottom = rct.Bottom + 1  
  406.    
  407.  rct.Top = rct.Top + 1  
  408.    
  409.  SetTextColor hdc, GetSysColor(COLOR_BTNTEXT)  
  410.    
  411.  DrawText hdc, s, LenB(StrConv(s, vbFromUnicode)), rct, DT_CENTER Or DT_SINGLELINE Or DT_VCENTER  
  412.    
  413.  Exit Sub  
  414.    
  415.  End If  
  416.    
  417.  'Button得到焦點時重畫  
  418.    
  419.  If (nState And ODS_FOCUS) = ODS_FOCUS Then  
  420.    
  421.  '畫內(nèi)部區(qū)域顏色  
  422.    
  423.  hbr = CreateSolidBrush(RGB(173, 203, 239))  
  424.    
  425.  SelectObject hdc, hbr  
  426.    
  427.  FillRect hdc, rct, hbr  
  428.    
  429.  DeleteObject hbr  
  430.    
  431.  '畫外圍灰框  
  432.    
  433.  hbr = CreateSolidBrush(RGB(107, 138, 181))  
  434.    
  435.  SelectObject hdc, hbr  
  436.    
  437.  FrameRect hdc, rct, hbr  
  438.    
  439.  DeleteObject hbr  
  440.    
  441.  '畫內(nèi)側(cè)3D效果->亮色  
  442.    
  443.  hpen = CreatePen(PS_SOLID, 1, RGB(198, 223, 247))  
  444.    
  445.  SelectObject hdc, hpen  
  446.    
  447.  MoveToEx hdc, rct.Left + 1, rct.Top + 1, P  
  448.    
  449.  LineTo hdc, rct.Right - 1, rct.Top + 1  
  450.    
  451.  MoveToEx hdc, rct.Left + 1, rct.Top + 1, P  
  452.    
  453.  LineTo hdc, rct.Left + 1, rct.Bottom - 1  
  454.    
  455.  DeleteObject hpen  
  456.    
  457.  '畫內(nèi)側(cè)3D效果->暗色  
  458.    
  459.  hpen = CreatePen(PS_SOLID, 1, RGB(132, 174, 222))  
  460.    
  461.  SelectObject hdc, hpen  
  462.    
  463.  MoveToEx hdc, rct.Left + 1, rct.Bottom - 2, P  
  464.    
  465.  LineTo hdc, rct.Right - 1, rct.Bottom - 2  
  466.    
  467.  MoveToEx hdc, rct.Right - 2, rct.Top + 1, P  
  468.    
  469.  LineTo hdc, rct.Right - 2, rct.Bottom - 1  
  470.    
  471.  DeleteObject hpen  
  472.    
  473.    
  474.    
  475.  SetTextColor hdc, GetSysColor(COLOR_BTNTEXT)  
  476.    
  477.  DrawText hdc, s, LenB(StrConv(s, vbFromUnicode)), rct, DT_CENTER Or DT_SINGLELINE Or DT_VCENTER  
  478.    
  479.  Else  
  480.    
  481.  '畫外圍灰框  
  482.    
  483.  hbr = CreateSolidBrush(RGB(132, 130, 132))  
  484.    
  485.  SelectObject hdc, hbr  
  486.    
  487.  FrameRect hdc, rct, hbr  
  488.    
  489.  DeleteObject hbr  
  490.    
  491.  '畫內(nèi)側(cè)3D效果->亮色  
  492.    
  493.  hpen = CreatePen(PS_SOLID, 1, RGB(255, 255, 255))  
  494.    
  495.  SelectObject hdc, hpen  
  496.    
  497.  MoveToEx hdc, rct.Left + 1, rct.Top + 1, P  
  498.    
  499.  LineTo hdc, rct.Right - 1, rct.Top + 1  
  500.    
  501.  MoveToEx hdc, rct.Left + 1, rct.Top + 1, P  
  502.    
  503.  LineTo hdc, rct.Left + 1, rct.Bottom - 1  
  504.    
  505.  DeleteObject hpen  
  506.    
  507.  '畫內(nèi)側(cè)3D效果->暗色  
  508.    
  509.  hpen = CreatePen(PS_SOLID, 1, RGB(189, 190, 189))  
  510.    
  511.  SelectObject hdc, hpen  
  512.    
  513.  MoveToEx hdc, rct.Left + 1, rct.Bottom - 2, P  
  514.    
  515.  LineTo hdc, rct.Right - 1, rct.Bottom - 2  
  516.    
  517.  MoveToEx hdc, rct.Right - 2, rct.Top + 1, P  
  518.    
  519.  LineTo hdc, rct.Right - 2, rct.Bottom - 1  
  520.    
  521.  DeleteObject hpen  
  522.    
  523.  '畫文字  
  524.    
  525.  SetTextColor hdc, GetSysColor(COLOR_BTNTEXT)  
  526.    
  527.  DrawText hdc, s, LenB(StrConv(s, vbFromUnicode)), rct, DT_CENTER Or DT_SINGLELINE Or DT_VCENTER  
  528.    
  529.  End If  
  530.   
  531. End Sub  
  532.   
  533. '新的窗口消息處理過程,將被插入到默認處理過程之前  
  534.   
  535. Private Function SubWndProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long  
  536.   
  537.  Dim di As DRAWITEMSTRUCT  
  538.    
  539.  If Msg = WM_DESTROY Then Terminate (hWnd)  
  540.    
  541.  '處理自畫消息  
  542.    
  543.  If Msg = WM_DRAWITEM Then  
  544.    
  545.  CopyMemory di, ByVal lParam, Len(di)  
  546.    
  547.  '判斷是自畫Button  
  548.    
  549.  If di.CtlType = ODT_BUTTON Then  
  550.    
  551.  DrawButton di.hwndItem, di.hdc, di.rcItem, di.itemState  
  552.    
  553.  '不返回VB的默認Button繪制過程  
  554.    
  555.  SubWndProc = 1  
  556.    
  557.  Exit Function  
  558.    
  559.  End If  
  560.    
  561.  End If  
  562.    
  563.  '調(diào)用默認的窗口處理過程  
  564.    
  565.  SubWndProc = CallWindowProc(PrevWndProc, hWnd, Msg, wParam, lParam)  
  566.   
  567. End Function  
  568.   
  569. '子類化入口  
  570.   
  571. Public Sub Init(hWnd As Long)  
  572.   
  573.  PrevWndProc = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf SubWndProc)  
  574.   
  575. End Sub  
  576.   
  577. '子類化出口  
  578.   
  579. Public Sub Terminate(hWnd As Long)  
  580.   
  581.  Call SetWindowLong(hWnd, GWL_WNDPROC, PrevWndProc)  
  582.   
  583. End Sub  
  584.   
  585. ' -- 模塊結(jié)束 -- '  

3. Visual Basic .NET子類化的實現(xiàn) 

  .NET中使用子類化技術(shù)要比VB6中簡單,因為微軟在.NET中已經(jīng)提供了接口,不需要我們再自己SetWindowLong了,我們做的是Overrides(覆蓋) WndProc過程即可。 
  Overrides Protected Sub WndProc( ByRef m As Message )參數(shù)m實現(xiàn)了Windows的消息類型。 

  下面的例子將演示如何將About加入窗口的系統(tǒng)菜單。 

①創(chuàng)建工程 

  創(chuàng)建一個VB.NET的Windows Application工程。 

②錄入代碼

  1. 代碼  
  2.   
  3. Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->Public Class Form1   
  4.   
  5. Inherits System.Windows.Forms.Form   
  6.   
  7. '中間隱去了.NET自動生成的代碼   
  8. ' – 引用Win32Api   
  9. Private Declare Function GetSystemMenu Lib "user32" (ByVal hWnd As IntPtr, ByVal bRevert As Int32) As Int32   
  10. Private Declare Function InsertMenu Lib "user32" Alias "InsertMenuA" (ByVal hMenu As Int32, ByVal nPosition As Int32, ByVal wFlags As Int32, ByVal wIDNewItem As Int32, ByVal lpNewItem As String) As Int32   
  11.   
  12. Private Const MF_BYCOMMAND = &H0&   
  13. Private Const MF_BYPOSITION = &H400&   
  14. Private Const MF_STRING = &H0&   
  15. Private Const MF_SEPARATOR = &H800&   
  16. Private Const WM_SYSCOMMAND = &H112   
  17.   
  18. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load   
  19.   
  20. InsertMenu(GetSystemMenu(Me.Handle, False), 0, MF_BYPOSITION Or MF_SEPARATOR, 2001, "") '加入一條分割線   
  21.   
  22. 'GetSystemMenu(Me.Handle, False)是得到系統(tǒng)菜單的句柄,第二個參數(shù)為True的話不能改變系統(tǒng)菜單,所以要設為False   
  23. InsertMenu(GetSystemMenu(Me.Handle, False), 0, MF_BYPOSITION Or MF_STRING, 2002, "About Me(&A)") '加入About me菜單在系統(tǒng)菜單中   
  24.   
  25. End Sub   
  26.   
  27. Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)   
  28. '類化窗口--覆蓋WndProc過程   
  29.   
  30. If m.Msg = WM_SYSCOMMAND Then   
  31.   
  32. If m.WParam.ToInt32 = 2002 Then   
  33.   
  34. MsgBox("About Context", vbInformation, "About...")   
  35.   
  36. End If   
  37.   
  38. End If   
  39.   
  40. '調(diào)用窗口默認的處理過程   
  41. MyBase.WndProc(m)   
  42.   
  43. End Sub   
  44.   
  45. End Class  

4. 小結(jié) 

  子類化技術(shù)可以讓我們實現(xiàn)一些使用VB在正常條件下無法完成的任務,而且通過這些技術(shù)可以更為深入的學習Windows編程,成為VB開發(fā)人員中的高手。
本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
VB編外掛的一些基礎知識
如何在VB中判斷Windows9x的運行模式
VB實用代碼,收藏!!
VB 遍歷窗口所有子窗體句柄
VB 判斷IP能否ping通
防止Access 2000密碼被破譯的方法
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服