Delpih ¤¤ªºWindows API½sµ{ªì¨B
2004-12-30    ¤è¦à    ¤Ñ·¥ºô
¦C¦L¦Û: ­»´äITºô
¦a§}: http://www.hkitn.com/article.php/2552
[1]

¡@¡@¨Ï¥ÎRADÃþ«¬¤u¨ãªº¤H¶V¨Ó¶V¦h¤F¡AÁöµM§Ú¹ï©óRADÃþªº¤u¨ã¦V¨Ó¤£¦h§@µûij¡A¦ý§ÚÁÙ¬O±`±`¨Ï¥Îªº¡C©Ò¥H§Ú²`²`ªºª¾¹D³oÃþ¤u¨ãÁöµMµ¹§Ú­Ì±a¨Ó¤F«K§Q¡A¨Ï§Ú­Ì¯à¤£¥Î±N§ó¦hªººë¤O©ñ¦b¤¶­±¤W¡A¦ý¦P®É¤]±Nªì¾ÇªÌºòºòªº°é¦b¤F¥L©Ò´£¨Ñªº±±¨î¶µ©M¤¸¥ó¤¤¡C©Ò¥H«Ü¦h¤H¨Ã¤£¯à¯u¥¿ªºÁA¸Ñwindowsªº®ø®§ÅX°Ê­ì²z¥H¤Îwindowsªº¹B§@¹Lµ{¡C¥»¤å¤¤§Ú­Ì´N¤@°_¨Ó¾Ç²ß¤@¤Uwindowsªº¹B§@¹Lµ{¡A¨Ï§Ú­Ì¹ïdelphi³o¼Ë¤@­ÓÀu¨qªº½sµ{¤u¨ã¦³¤@­Ó·sªº»{ÃÑ¡A¨Ã¹ïwindows¤Uªºµ{¦¡½s¼g¦³§ó²`¨è¡B³zÅPªºÁA¸Ñ©M»{ÃÑ¡C

¡@¡@¤@¡B®ø®§ªº©w¸q

¡@¡@§Ú­Ì¥ý±q¨Ï¥Îªº¨¤«×¬Ý¬Ýwindowsªº¹B§@¹Lµ{¡C§Ú­Ì³£ª¾¹Dwindows¬O¤@­Ó¦h¤uªº¥­»O¡A¨Ï¥Î³o­Ó¥­»O¡A§Ú­Ì¥i¥H¤@Ãä¤u§@¡A¤@ÃäÅ¥ºq¦±¡Aµ¥µ¥¡C©Ò¥H¹ï©ó³o­Ó¾Þ§@¥­»O¥i¥H·Q¹³¨ì¥¦°£¤F¤@¯ë§@·~¨t²Î©Ò´£¨Ñªº¹ïÀɨt²Î¡A°O¾ÐÅé¨t²Îµ¥ªººÞ²z¤§¥~¡A§ó­«­nªº´N¬O§Ú­Ì©Ò¼ôª¾ªº®ø®§ÅX°Ê¤F¡A¤]´N¬O»¡¡A­n³q¹L¤@©wªº¤èªk©Mµ²ºc¥i¥Hµ¹¨C¤@­Ó¹B¦æ¤¤ªºµ{¦¡¹ê¨Ò¥H¤Î¨ä¤¤ªº¨C¤@­Óµøµ¡¶Ç»¼¨ä¤¤©ÒIJµoªº¨Æ¥ó¡C Windows¤¤¨s³º¬O«ç¼Ë°µ¨ìªº©O¡HÅý§Ú­Ì¥´¶}¦w¸Ëdelphiªº¥Ø¿ý¡A¦b¨ä¤¤ªºsource\rtl\Win\Windows.pasÀÉ¡]©ÎªÌ¦b¤@­Ó¤uµ{ÀÉ¡A§ä¨ìuses¡A¦b¨ä¤¤§ä¨ì¢åindows¡AµM«á«ö¤UCtrlÁä¡A¥Î·Æ¹«ÂIÀ»³æµü¡^¡A¦b¨ä¤¤ªº²Ä18919¦æ¡A§Ú­Ì¥i¥H¬Ý¨ì³o¼Ë¤@­Óµ²ºcªº©w¸q¡G
{ Message structure }
PMsg = ^TMsg ;
tagMSG = packed record
hwnd : HWND ;
message : UINT ;
wParam : WPARAM ;
lParam : LPARAM ;
time : DWORD ;
pt : TPoint ;
end ;
{ $ EXTERNALSYM tagMSG }
TMsg = tagMSG ;
MSG = tagMSG ;
{ $ EXTERNALSYM MSG }

¡@¡@¨ä¤¤hwndÄæ¦ìªí¥ÜIJµo¤F®ø®§ªºµøµ¡ªºID¡A¥Ñ¦¹¥i¥H«OÃÒ®ø®§¥¿½Tªºµo°e¨ì¨C¤@­Óµøµ¡¥h¡C Message ªí¥Ü®ø®§ªºÃþ«¬¡A¨ä¤¤§ó²Ó½oªº¸ÑÄÀ­n³q¹LwParam©MlParam¤@°_¨Ó¶i¦æ¡A¤£¦Pªº®ø®§¡AwParam©MlParamªº­È¤]´N¤£¬Û¦P¡Ctime¥Î¨Ó°O¿ý®ø®§Ä²µoªº®É¶¡¡CPt«hªí¥ÜIJµoªº¦ì¸m¡]²¦³ºwindow¤¤¦³¤F·Æ¹«¡^¡C§Ú­Ì¤]¥i¥H¥Î¦P¼Ëªº¤èªk¥´¶}MessagesÀÉ¡C¨ä¤¤©w¸q¤Fwindows¤¤ªºµ´¤j³¡¤À®ø®§©Mµ²ºc¡C¤U­±¬O§Ú­ÌºI¨úªº¨ä¤¤¤@³¡¤À¡C
const
¡@{ $ EXTERNALSYM WM_NULL }
¡@¡@WM_NULL = $0000 ;
¡@{ $ EXTERNALSYM WM_CREATE }
¡@¡@WM_CREATE = $0001 ;
¡@{ $ EXTERNALSYM WM_DESTROY }
¡@¡@WM_DESTROY = $0002 ;
¡@{ $ EXTERNALSYM WM_MOVE }
¡@¡@WM_MOVE = $0003 ;
¡@{ $ EXTERNALSYM WM_SIZE }
¡@¡@WM_SIZE = $0005 ;
¡@¡@¡K¡K ¡K¡K
¡@¡@WM_APP = $8000 ;
¡@{ NOTE : All Message Numbers below 0x0400 are RESERVED }
¡@{ Private Window Messages Start Here }
¡@{ $ EXTERNALSYM WM_USER }
¡@¡@WM_USER = $0400 ;
¡@¡@¡K¡K ¡K¡K¡@
¡@{ Dialog messages }
¡@{ $ EXTERNALSYM DM_GETDEFID }
¡@¡@DM_GETDEFID = ( WM_USER+0 ) ;
¡@{ $ EXTERNALSYM DM_SETDEFID }
¡@¡@DM_SETDEFID = ( WM_USER+1 ) ;
¡@{ $ EXTERNALSYM DM_REPOSITION }
¡@¡@DM_REPOSITION = ( WM_USER+2 ) ;
¡@{ $ EXTERNALSYM PSM_PAGEINFO }
¡@¡@PSM_PAGEINFO = ( WM_USER+100 ) ;
¡@{ $ EXTERNALSYM PSM_SHEETINFO }
¡@¡@PSM_SHEETINFO = ( WM_USER+101 ) ;
¡@{ Button Notification Codes }
¡@¡@¡K¡K ¡K¡K

¡@¡@¥i¥H¬Ý¨ì¡Awindows¤¤¨C¤@­Ó®ø®§³£¹ïÀ³µÛ¤@­Ó°ß¤@ªº¼Æ­È¡C·íµM§Ú­Ì¤]¥i¥H©w¸q¦Û¤vªº®ø®§¡A¥¦ªº¼Æ­È¥u­n©w¸q¦bWM_USER¤§«á¡A«OÃÒ©M¨ä¤¤ªº©w¸q¤£·Q­«½Æ§Y¥i¡C

¡@¡@¤G¡B®ø®§ªº±µ¦¬

¡@¡@®ø®§¨ì¬O¦³¤F¡A¦ý«ç¼Ë¤~¯àÅýµ{¦¡¥H¤Îµøµ¡±µ¦¬¨ì©O¡HÁÙ¬O±q¨Ï¥Îªº¨¤«×¦Ò¼{¡A¥i¥H·Q¹³¨ì¡A¹ï©ó¤@­Óµ{¦¡©Îµøµ¡¥i¥H±µ¦¬¨ì¨Ó¦Û·Æ¹«¡BÁä½Lµ¥¿é¤J³]³Æªº®ø®§¡A¤]¥i¥H±µ¦¬¨ì¨Ó¦Ûµ{¦¡¶Ç»¼ªº®ø®§¡A¦]¬°¦³¤F«e­±ªºtagMSGµ²ºc¡A§Ú­Ì´N¥i¥H³Q°Êªº¦bµ{¦¡¤¤±µ¦¬®ø®§¤F¡C³o­Ó¥\¯àªº¹ê²{´N¬O¥Ñ¤U­±ªºµ{¦¡¹ê²{ªº¡]¦P¼Ëªº³o¬qµ{¦¡¨Ó¦Û©ódelphiªº¤¸¥N½X¡^¡G
function Tapplication . ProcessMessage ( var Msg : TMsg ) : Boolean;
var
¡@Handled : Boolean ;
begin
¡@Result : = False ;
¡@if PeekMessage ( Msg , 0 , 0 , 0 , PM_REMOVE ) then
¡@begin
¡@¡@Result : = True ;
¡@¡@if Msg.Message <> WM_QUIT then
¡@¡@begin
¡@¡@¡@Handled := False ;
¡@¡@¡@if Assigned ( FonMessage ) then FonMessage ( Msg , Handled ) ;
¡@¡@¡@if not IsHintMsg ( Msg ) and not Handled and not IsMDIMsg ( Msg ) and
¡@¡@¡@not IsKeyMsg ( Msg ) and not IsDlgMsg ( Msg ) then
¡@¡@¡@begin
¡@¡@¡@¡@TranslateMessage ( Msg ) ;
¡@¡@¡@¡@DispatchMessage ( Msg ) ;
¡@¡@¡@end ;
¡@¡@end ;
¡@else
¡@¡@FTerminate : = True ;
¡@end ;
end ;

¡@¡@¨ä¤¤¥D­nªº¬O³o´X¥y¡G
if PeekMessage ( Msg , 0 , 0 , 0 , PM_REMOVE ) then
begin
¡@TranslateMessage ( Msg ) ;
¡@DispatchMessage ( Msg ) ;
end ;

¡@¡@¦ý§ó±`¨£ªº¬O¡G
while GetMessage ( Msg , 0 , 0 , 0 ) do
begin
¡@TranslateMessage ( Msg ) ;
¡@DispatchMessage ( Msg ) ;
End ;

¡@¡@PeekMessage©MGetMessage³£¬O±q®ø®§¦î¦C¤¤±o¨ìµoµ¹µ{¦¡ªº®ø®§¡A¥u­n¦³®ø®§¡A´N³q¹LTranslateMessage ( Msg )©MDispatchMessage ( Msg )¨â¥y±N®ø®§Â½Ä¶¬°¥i³B²zªº®æ¦¡¨Ã¤À¬£µ¹À³¥Îµ{¦¡©Òµù¥Uªº¦^½Õ¨ç¼Æ¶i¦æ³B²z¡C

[2]

¡@¡@¤T¡B®ø®§ªº³B²z

¡@¡@¨º»ò®ø®§¬O«ç¼Ë³Q³B²zªº©O¡H¦^½Õ¨ç¼Æ¤S¦³¤°»ò§@¥Î©O¡H¦³¤F«e­±ªºª¾ÃÑ¡A§Ú­Ì¥u­n¯à¹ï¤£¦Pªº®ø®§¶i¦æ¥¿½Tªº¸ÑÄÀ¡A´N¥i¥H°µ¨ì¹ï®ø®§ªº¥¿½T³B²z¤F¡C¦ý«e­±§Ú­Ì´£¨ì¤F¹ï©ó¤£¦Pªº®ø®§¶Ç»¼ªº¸ê°T¨Ï¤£¬Û¦Pªº¡A©Ò¥H³o¬OAPI½sµ{¤¤³Ì³Â·Ðªº¤@³¡¤À¤F¡C

¡@¡@§Ú­Ì³oùØ¥ýµ¹¥X¤@­Ó±`¨£¦Ó¤S¥²¶·ªº°T®§¤è¶ô¬[¡C
function WindowProc ( hwnd : HWnd ; Msg : UINT; Wparam : WPARAM ; Lparam : LPARAM ) : LRESULT ; stdcall ; export ;
var
¡@dc : hdc ;
¡@rc : Trect ;
¡@ps : TpaintStruct ;
begin
¡@case Msg of
¡@¡@WM_PAINT :
¡@¡@Begin
¡@¡@¡@dc : = BeginPaint ( hwnd , ps ) ;
¡@¡@¡@¡K¡K ¡K¡K
¡@¡@¡@EndPaint (hwnd, &ps) ;
¡@¡@¡@Exit ;
¡@¡@end;
¡@¡@WM_COMMAND :
¡@¡@¡K¡K ¡K¡K
¡@¡@WM_DESTROY :
¡@¡@Begin
¡@¡@PostQuitMessage ( 0 ) ;
¡@¡@Exit ;
¡@end ;
end;
Result : = DefWindowProc ( hWnd , Msg , wParam , lParam ) ;
end ;

¡@¡@¦b³o­Ó®Ø¬[¤¤¡AWindowProc´N¬O§Ú­Ì«e­±´£¨ìªº¦^½Õ¨ç¼Æ¡C¥¦¬Owindowsµ{¦¡³]­p¤¤ªº­«ÂI¡CµL½×¬O±q¿é¤J¿é¥Xµ¥µwÅé³]³Æ¶Ç¨Óªº®ø®§¡AÁÙ¬O±q³nÅé¶Ç¨Óªº®ø®§¡A³£­n«O¦s¨ì¨t²Îªº®ø®§¦î¦C¤¤¡A³o­Ó®ø®§¦î¦C¦³¨âºØ¡A¤@ºØ¬O¨t²Î®ø®§¦î¦C¡A¥D­n¬O¥Î¨Ó«O¦s±q¿é¤J¿é¥Xµ¥µwÅé³]³Æ¶Ç¨Óªº®ø®§¡A¥t¤@ºØ¬O¨C­Óµ{¦¡µøµ¡ªºµøµ¡®ø®§¦î¦C¡A¥D­n«O¦s¨C­Óµøµ¡ªºµo°e¨Óªº®ø®§¡C¤§«á¹ï®ø®§ªºÀò¨ú©M¤Àµo¤u§@¡A·íµM¬O¥Ñ«e­±Á¿¨ìªºGetMessage ¡B TranslateMessage©MDispatchMessage¤T­Ó¨ç¼Æ¨Ó§¹¦¨¡C¦Ü©ó®ø®§ªº³B²z¤u§@¡A«h¬O¥ÑWindowProc¨ç¼Æ¨Ó§¹¦¨¤F¡C¤]´N¬O»¡¥¦¬O¥Ñ¨t²Î¦bµ{¦¡¦³®ø®§¨ì¹F®É¤~½Õ¥Îªº¡A©Ò¥H§Ú­ÌºÙ¤§¬°¦^½Õ¨ç¼Æ¡C

¡@¡@WindowProc¬O¦bµù¥Uµøµ¡Ãþ®É¡Aµù¥Uªºµøµ¡®ø®§³B²z¨ç¼Æ,·íµM¦W¦r¥i¥H¦Û¤v©R¦W¡C¨ä¤¤ªº°Ñ¼Æ¦³hwnd : HWnd ; Msg : UINT; Wparam : WPARAM ; Lparam : LPARAM ¡A³o¤]´N¬O§Ú­Ì«e­±½Í¨ìªº®ø®§©Mªí³æ¡C

¡@¡@³oùاڭ̥D­n¨Ï¥Î¤F¤TºØ®ø®§¡GWM_PAINT ¡A WM_COMMAND©MWM_DESTROY ¡A¦ý¬O§Ú­Ì¥i¥HÀHµÛµ{¦¡¦Ó¬O¥Î¦UºØ¦U¼Ëªº®ø®§¡C¬°¤F³B²z¤£¦Pªº®ø®§¡A¦bµ{¦¡¤¤¨Ï¥Î¤F¤À¤äµ²ºc¡A©Ò¥HÀHµÛµ{¦¡ªº³W¼Ò¶V¨Ó¶V¤j¡A³o­Ó¤À¤äµ²ºc¤]·|¶V¨Ó¶VÃe¤j¡C

¡@¡@¦b³o¨Ç®ø®§¤¤¦³¨â­ÓÂI¬O³Ì¬°­«­nªº¡A¨ä¤@¬OWM_DESTROY®ø®§¡A¥¦ªí¥Ü¤@­Ó¾P·´µøµ¡°h¥XÀ³¥Îµ{¦¡ªº®ø®§¡C¤]¬O¨C­Óµ{¦¡©Ò¥²³Æªº¡C¹ï©ó³o­Ó®ø®§ªº³B²z¤è¦¡´N¬O³q¹L½Õ¥ÎPostQuitMessage ( 0 )¨ç¼Æ¶Ç»¼¤@­ÓWM_QUIT®ø®§¡A·Ç³ÆÅý¥ÑGetMessage ¡B TranslateMessage©MDispatchMessage¤T­Ó¨ç¼Æ²Õ¦¨ªº®ø®§°j°é¤¤ªºGetMessage¨ú±o¡C·í®ø®§°j°é¤¤ªº¦¬¨ìWM_QUIT®ø®§®É¡AGetMessage·|¶Ç¦^0¡A±q¦Óµ²§ô®ø®§°j°é¡C¶i¦ÓÄÀ©ñ¦UºØ¸ê·½¡Aµ²§ô¾ã­Óµ{¦¡¡C¥t¤@­Ó­«­nªº¦a¤è¬ODefWindowProc¨ç¼Æ¡C§Ú­Ìªºµ{¦¡µL½×¦h¤j³£¤£¥i¯à±N©Ò¦³ªº®ø®§³£³B²z¡A©Ò¥H§Ú­Ì¥²¶·¦³¤@­Ó¾÷¨îÅý¤£­«­nªº¤£»Ý­n§Ú­Ì³B²zªº®ø®§¡A¥æµ¹windows§@·~¨t²Î¬°§Ú­Ì³B²z¡A³o­Ó¹Lµ{´N¬O¥ÑDefWindowProc¨ç¼Æ¨Ó¹ê²{ªº¡C ¦]¦¹·í§Ú­Ì«ö¤Uµøµ¡¥k¤W¨¤ªº®t¸¹©ÎªÌ«ö¤U¥ª¤W¨¤¨t²Î¥\¯àªí¤¤ªºClose©R¥O®É¡A¨t²Î·|°e¥XWM_CLOSE®ø®§¡C³q±`µ{¦¡ªºµøµ¡¨ç¼Æ¤£ÄdºI¦¹®ø®§¡A©ó¬O¥æ¥ÑDefWindowProc¨ç¼Æ¨Ó³B²z¡CDefWindowProc¨ç¼Æ¦b¨ü¨ìWM_CLOSE®ø®§«á¡A½Õ¥ÎDestroyWindow§âµøµ¡²M°£¡CDestroyWindow¤S·|°e¥XWM_DESTROY®ø®§¡Cµ{¦¡¤S¦p«e­±Á¿¨ìªº¤@¼Ë¨Óµ²§ôµ{¦¡ÄÀ©ñ¸ê·½¡C

¡@¡@¥|¡B«Ø¥ßµøµ¡Ãþ

¡@¡@ª¾¹D¤F®ø®§ªº¶Ç»¼©M³B²z¤§«á¡A§Ú­Ì¨Ó¬Ý¬Ý¦³Ãöµøµ¡ªºª¾ÃÑ¡C

¡@¡@Windows±aµ¹§Ú­Ìªº¤£¶È¬O§Þ³N¤Wªº³Ð·s¡A§ó­«­nªº¬O²Î¤@¦Ó¤S«K±¶ªºµøµ¡¡C¨º»ò¥¦¬O«ç¼Ë³Ð«Øªº©O¡H³o´N­n±qµ¡¤fÃþtagWNDCLASSA»¡°_¤F¡C

¡@¡@Åý§Ú­Ì¥ý¥´¶}delphi¥Ø¿ý¤Uªºsource\rtl\Win\Windows.pasÀÉ¡A18875¦æ¡A¥i¥H¬Ý¨ì³o¼Ë¤@­Óµ²ºc¡G
tagWNDCLASSA = packed record
style : UINT ;
lpfnWndProc : TFNWndProc ;
cbClsExtra : Integer ;
cbWndExtra : Integer ;
hInstance : HINST ;
hIcon : HICON ;
hCursor : HCURSOR ;
hbrBackground : HBRUSH ;
lpszMenuName : PansiChar ;
lpszClassName : PansiChar ;
end ;

¡@¡@¨ä¤¤¦sÀx¤F¤@­Óµøµ¡ªº©Ò¦³¬ÛÃö¸ê°T¡Cstyle : UINT ªí¥Üµøµ¡ªº­·®æ¡FlpfnWndProc : TFNWndProc ªí¥Üµøµ¡ªº®ø®§³B²z¨ç¼Æ¡FhInstance : HINST ªí¥Üµøµ¡ªº¤@­ÓÀ³¥Î¹ê¨Ò¡FIcon : HICON ¥Î¨Ó°O¿ýµøµ¡ªº¹Ï¥Ü¡FhCursor : HCURSOR °O¿ýµøµ¡ªº´å¼Ð¡FhbrBackground : HBRUSH ¥Î¨Ó°O¿ýµøµ¡ªº­I´º¦â¡FlpszMenuName : PansiChar ªí¥Üµøµ¡¤¤ªº¥\¯àªí¸ê·½ªº¦WºÙ¡F lpszClassName : PansiChar °O¿ýµøµ¡Ãþªº¦WºÙ¡C

¡@¡@¤U­±¬O¤@­Ó¨Ò¤l¡G
WindowClass . style : = CS_VREDRAW + CS_HREDRAW + CS_DBLCLKS ;
WindowClass . lpfnWndProc : = @DefWindowProc ;
WindowClass . hCursor : = LoadCursor ( 0 , IDC_ARROW ) ;
WindowClass . hbrBackground : = 0 ;
WindowClass . hInstance : = Hinstance ;
StrPCopy ( WinClassName , ClassName ) ;

¡@¡@¤­¡Bµù¥Uµøµ¡Ãþ

¡@¡@·í§Ú­Ì«ö·Óµ{¦¡ªº­n¨D³Ð«Ø¤F³o­Óµøµ¡Ãþ¤§«á¡A§Ú­Ì´N¥i¥H¦b¨t²Î¤¤µù¥U¥¦¤F¡C³o´N­n¥Î¨ìfunction RegisterClass(const lpWndClass: TWndClass): ATOM; stdcall;³o¼Ë¤@­Ó¨ç¼Æ¤F¡C¥L¥u¦³¤@­Ó°Ñ¼Æ¡A´N¬O§Ú­Ì¥ý«e»¡µù¥Uªºµøµ¡Ãþ¡C

¡@¡@¤»¡B³Ð«Øµ¡¤f

¡@¡@¦³¤F«e­±´X¨B¡A²{¦b§Ú­Ì¥i¥H³Ð«Ø§Ú­Ì©Òµù¥Uªºµøµ¡¡A¬Ý¬Ý¦oªº¯u­±¥Ø¤F¡C
function CreateWindow ( lpClassName : Pchar ; lpWindowName : PChar ;
dwStyle : DWORD ; X , Y , nWidth , nHeight : Integer ; hWndParent : HWND ;
hMenu : HMENU ; hInstance : HINST ; lpParam : Pointer ) : HWND ;

¡@¡@³o­Ó¨ç¼Æ¥i¥HÀ°§U§Ú­Ì³Ð«Ø§Ú­Ì¥ý«eµù¥Uªºµøµ¡¡C¨ä¤¤ªº°Ñ¼ÆlpClassName : Pcharªí¥Ü§Ú­Ì«e­±µù¥Uªºµøµ¡Ãþªº¦WºÙ¡ClpWindowName : PChar ªí¥Üµøµ¡ªº¼ÐÃD¡F dwStyle : DWORD ªí¥Üµøµ¡ªº­·®æ¡F X , Y , nWidth , nHeight : Integer ; ªí¥Üµøµ¡ªº¦ì¸m©M¼e«×°ª«×¡F

¡@¡@¤C¡BÅã¥Üµøµ¡

¡@¡@µøµ¡³Ð«Ø¤F¡A¦ý§Ú­Ì¥u¦³¦b½Õ¥Îfunction ShowWindow ( hWnd : HWND ; nCmdShow : Integer ) : BOOL ; stdcall ;¨ç¼Æ¤§«á¤~·|Åã¥Ü¥X¨Ó¡C³o­Ó¨ç¼Æ«Ü²³æ¡AhWnd : HWND ªí¥Üµøµ¡ªº±±¨î½X¡A nCmdShow : Integer«h¬Oµøµ¡ªºÅã¥Ü¤è¦¡¡Cfunction UpdateWindow ( hWnd : HWND ) : BOOL ; stdcal l ;¨ç¼Æ«h·|°e¥X¤@­ÓWM_PAINT®ø®§¡A¨Ïªí³æ±o¨ì§ó·s¡C

¡@¡@¤]³\§A·|ı±o«Ü·Ð¤H¡A¦ý³o¬O©Ò¦³windowsµ{¦¡ªº°ò¦¡A§Y«K¬O§Ú­Ì¥Îdelphi½sµ{®É¡Aµ{¦¡¤]³£¬O³o¼Ë¹B¦æªº¡A¥u¬Odelphiªº³Ð³yªÌ±N¤@¤Á³£ÁôÂèì¤F¤@­Ó¬üÄR¥~ªí¤§¤U¡C

¡@¡@¤U­±§Ú­Ì¥Î¤j®a³Ì±`¨£ªº¤@­Ó¨Ò¤l¹ï«e­±ªºª¾ÃÑ¥[¥HÁ`µ²¡C¦b³o­Ó¨Ò¤l¤¤¡A§Ú­Ì±N¦bªí³æ¤¤Åã¥Ü¡§ hello , world ! ¡¨ ¡C¤U­±¬Oµ{¦¡¤Î¨ä¹B¦æ®ÄªG¡G
program Project1;
{ $ APPTYPE CONSOLE }
uses
Windows ,
Messages ;
{ uses
¡@SysUtils ; }
var
¡@wClass : TWndClass; // ¥Dµ¡¤fÃþ
¡@hInst , //À³¥Îµ{¦¡±±¨î½X
¡@Handle : HWnd ; // ¥Dµ¡¤f
¡@aMsg : TMsg ; //®ø®§
¡@RCT : TRect ; //°Ï°ì
¡@ps : TPaintStruct ; //Åã¥Ü
¡@dc : hdc ; //³]³Æ¤W¤U¤å
¡@//¨ç¼Æ¡GWindowProc
¡@//§@¥Î¡G³B²z¥Dµøµ¡ªº®ø®§
¡@function WindowProc ( hWnd , Msg , wParam , lParam : Longint ) : Longint ; stdcall ;
¡@begin
¡@¡@WindowProc : = 0 ;
¡@case Msg of
¡@¡@WM_PAINT :
¡@begin
¡@¡@dc : =BeginPaint ( hWnd , ps ) ;
¡@¡@GetClientRect ( hWnd , RCT ) ;
¡@¡@DrawText ( dc , ' hello , world ! ' , -1 , RCT , Dt_SINGLELINE or DT_CENTER or DT_VCENTER ) ;
¡@¡@EndPaint ( hWnd , ps ) ;
¡@¡@Exit ;
¡@end ;
¡@¡@WM_DESTROY : //µ²§ôÀ³¥Îµ{¦¡
¡@¡@Begin
¡@¡@PostQuitMessage ( 0 ) ;
¡@¡@Exit ;
¡@¡@end ;
¡@end ;
¡@Result : = DefWindowProc ( hWnd , Msg , wParam , lParam ) ; //®ø®§Àq»{³B²z
end ;
//¥Dµ¡¤f
begin
// hInst : = GetModuleHandle ( nil ) ; // Àò±oÀ³¥Îµ{¦¡±±¨î½X
with wClass do //ªì©l¤Æµ¡¤fÃþ
begin
¡@hInstance : = system.MainInstance ;
¡@Style : = CS_HREDRAW or CS_VREDRAW ;
¡@HIcon : = LoadIcon ( 0 , IDI_APPLICATION ) ;
¡@LpfnWndProc : = @WindowProc ;
¡@HbrBackground : = GetStockObject ( WHITE_BRUSH ) ;
¡@lpszClassName : = ' Sample Class ' ;
¡@hCursor : = LoadCursor ( 0 , IDC_ARROW ) ;
end ;
RegisterClass ( wClass ) ; // µù¥Uµøµ¡Ãþ
//³Ð«Ø¥Dµ¡¤f
Handle : = CreateWindow (
' Sample Class ' , // µ¡¤fÃþ¦W
' Windows API¦bDelphi¤¤ªºÀ³¥Î ' , //µøµ¡¼ÐÃD
WS_OVERLAPPEDWINDOW or WS_VISIBLE , // µøµ¡­·®æ
10 , //¥ªÃä¬É®y¼Ð
10 , //¤WÃä¬É®y¼Ð
400 , // ¼e«×
300 , // °ª«×
0 , // ¤÷µ¡¤f±±¨î½X
0 , //µæ³æ±±¨î½X
system . MainInstance , // À³¥Îµ{¦¡¹ê¨Ò
nil //³Ð«Øµ¡¤fªºªþ¥[°Ñ¼Æ
) ;

if Handle <> 0 then
begin
¡@ShowWindow ( Handle , SW_SHOW ) ;
¡@UpdateWindow ( Handle ) ;
end ;

while ( GetMessage ( aMsg , Handle , 0 , 0 ) ) do //®ø®§°j°é
begin
¡@TranslateMessage ( aMsg ) ; //½Ķ®ø®§ DispatchMessage ( aMsg ) ; //µo°e®ø®§
end ;
end .

[3]

¡@¡@¤K¡Bªì¨Bªº«Ê¸Ë¡A ­±¦V¹Lµ{ªº¤è¦¡ªº½s¼g

¡@¡@¥i¥H¬Ý¨ì¹ï©ó¥ô¦ó¤@­ÓWindowsµ{¦¡ªº³Ð«Ø©M¹B¦æ³£­n¸g¹L¤W­±ªº´X­Ó¨BÆJ¡A¦Ó¥B³o¨Ç¨BÆJ¤S«Ü¦³±ø²z¡A©Ò¥H§Ú­Ì¤S¥i¥H±N¤£¦Pªº¥\¯à«Ê¸Ë¦b´X­Ó©R¦W³W½d¥B®e©ö²z¸Ñªº¨ç¼Æ¤§¤¤¡C¤U­±¬O­×§ï«áªºµ{¦¡½X¡G
program Project1;
{ $ APPTYPE CONSOLE }
uses
Windows ,
Messages ;
{ uses
¡@SysUtils ; }
var
wClass : TWndClass; // ¥Dµ¡¤fÃþ
hInst , //À³¥Îµ{¦¡±±¨î½X
Handle : HWnd ; // ¥Dµ¡¤f
aMsg : TMsg ; //®ø®§
RCT : TRect ; //°Ï°ì
ps : TPaintStruct ; //Åã¥Ü
dc : hdc ; //³]³Æ¤W¤U¤å

//¨ç¼Æ¡GWindowProc
//§@¥Î¡G³B²z¥Dµøµ¡ªº®ø®§

function WindowProc ( hWnd , Msg , wParam , lParam : Longint ) : Longint ; stdcall ;
begin
¡@WindowProc : = 0 ;
¡@case Msg of
¡@¡@WM_PAINT :
¡@¡@begin
¡@¡@¡@dc : =BeginPaint ( hWnd , ps ) ;
¡@¡@¡@GetClientRect ( hWnd , RCT ) ;
¡@¡@¡@DrawText ( dc , ' hello , world ! ' , -1 , RCT , Dt_SINGLELINE or DT_CENTER or DT_VCENTER ) ;
¡@¡@¡@EndPaint ( hWnd , ps ) ;
¡@¡@¡@Exit ;
¡@¡@end ;
¡@¡@WM_DESTROY : //µ²§ôÀ³¥Îµ{¦¡
¡@¡@Begin
¡@¡@¡@PostQuitMessage ( 0 ) ;
¡@¡@¡@Exit ;
¡@¡@end ;
¡@end ;
¡@Result : = DefWindowProc ( hWnd , Msg , wParam , lParam ) ; //®ø®§Àq»{³B²z
end ;

//¨ç¼Æ¡GWinRegister
//§@¥Î¡Gµù¥Uµøµ¡Ãþ

function WinRegister : Boolean ;
begin
¡@with wClass do //ªì©l¤Æµ¡¤fÃþ
¡@begin
¡@¡@hInstance : = system.MainInstance ;
¡@¡@Style : = CS_HREDRAW or CS_VREDRAW ;
¡@¡@HIcon : = LoadIcon ( 0 , IDI_APPLICATION ) ;
¡@¡@LpfnWndProc : = @WindowProc ;
¡@¡@HbrBackground : = GetStockObject ( WHITE_BRUSH ) ;
¡@¡@lpszClassName : = ' Sample Class ' ;
¡@¡@hCursor : = LoadCursor ( 0 , IDC_ARROW ) ;
¡@end ;
¡@ReSult : = RegisterClass ( wClass ) <> 0 ; // µù¥Uµøµ¡Ãþ end ;
¡@//¨ç¼Æ¡GWinCreate
¡@//§@¥Î¡G³Ð«Øµ¡¤f
¡@function WinCreate : HWnd ;
¡@begin
¡@¡@//³Ð«Ø¥Dµ¡¤f
¡@¡@Handle : = CreateWindow (' Sample Class ' , // µ¡¤fÃþ¦W
¡@¡@¡@¡@¡@¡@¡@' Windows API¦bDelphi¤¤ªºÀ³¥Î ' , //µøµ¡¼ÐÃD
¡@¡@¡@¡@¡@¡@¡@WS_OVERLAPPEDWINDOW or WS_VISIBLE , // µøµ¡­·®æ
¡@¡@¡@¡@¡@¡@¡@10 , //¥ªÃä¬É®y¼Ð
¡@¡@¡@¡@¡@¡@¡@10 , //¤WÃä¬É®y¼Ð
¡@¡@¡@¡@¡@¡@¡@400 , // ¼e«×
¡@¡@¡@¡@¡@¡@¡@300 , // °ª«×
¡@¡@¡@¡@¡@¡@¡@0 , // ¤÷µ¡¤f±±¨î½X
¡@¡@¡@¡@¡@¡@¡@0 , //µæ³æ±±¨î½X
¡@¡@¡@¡@¡@¡@¡@system . MainInstance , // À³¥Îµ{¦¡¹ê¨Ò
¡@¡@¡@¡@¡@¡@¡@nil //³Ð«Øµ¡¤fªºªþ¥[°Ñ¼Æ
¡@¡@) ;

¡@if Handle <> 0 then
¡@begin
¡@¡@ShowWindow ( Handle , SW_SHOW ) ;
¡@¡@UpdateWindow ( Handle ) ;
¡@end ;
¡@Result : = Handle ;
¡@end ;

¡@//¥Dµ¡¤f
¡@//µ{¦¡ªº¶i¤JÂI
¡@begin
¡@if not WinRegister then //½Õ¥Î¨ç¼Æ¡GWinRegisterµù¥Uµøµ¡Ãþ
¡@begin
¡@¡@MessageBox ( 0 , ¡¥ Register failed ¡¥ , nil , MB_OK ) ;
¡@¡@Exit ;
¡@end ;
¡@Handle : = WinCreate ; //½Õ¥Î¨ç¼Æ¡GWinCreate³Ð«Øµ¡¤f
¡@if longint ( Handle ) = 0 then
¡@begin
¡@¡@MessageBox ( 0 , ¡¥ WinCreate failed ¡¥ , nil , MB_OK ) ;
¡@¡@Exit ;
¡@end;
¡@while ( GetMessage ( aMsg , Handle , 0 , 0 ) ) do //®ø®§°j°é
¡@begin
¡@¡@TranslateMessage ( aMsg ) ; //½Ķ®ø®§
¡@¡@DispatchMessage ( aMsg ) ; //µo°e®ø®§
¡@end ;
end .

[4]

¡@¡@¤E¡B¶i¤@¨B«Ê¸Ë¡A­±¦Vª«¥óªº¤èªk½s¼g

¡@¡@§ó¶i¤@¨Bªº¸Ü¡A§Ú­Ì´N¥i¥H¦Ò¼{¥Î­±¦Vª«¥óªº¤èªk¨Ó½s¼g¡C ¥i¥H¬Ý¨ì¦pªG§Ú­Ì­n¥Î¤W­±ªº¤èªk½s¼gµ{¦¡ªº¸Ü¡A¤u§@¶q¬O¤Q¤ÀÁc­«ªº¡A¤×¨ä¦bµ{¦¡³W¼Ò¶V¨Ó¶V¤jªº±¡ªp¤U¡A¥X¿ùªº¥i¯à©Ê¤]´N·|¦¨«ü¼Æ©Êªº¼Wªø¡C§Y¨Ï§Ú­Ì¨Ï¥ÎÖß¶K«þ¨©¤´µM­n¹ïµ{¦¡¶i¦æ­×§ï¡A¥X¿ùªº¥i¯à¤H¤£·|Á×§K¡C¦Ó­±¦Vª«¥óªº½sµ{¤èªk¥i¥H¦³®Äªº§JªA¥H¤Wªº¤£¨¬¡A¤j¤jªº´£°ª¤F¥N½Xªº§Q¥Î²v¡C©Ò¥H¤U­±§Ú­Ì´N¥Î­±¦Vª«¥óªº¤èªk¨Ó¬Ý¤@¬Ý¦P¼Ëªºµ{¦¡§Ú­ÌÀ³¸Ó«ç¼Ë½s¼g¡C

¡@¡@­±¦Vª«¥óªº®Ö¤ß´N¬O­n¥ÎÃþªº¤èªk¨Ó«Ø¥ßµ{¦¡®Ø¬[¡AµM«á¥ÎÃþªº¹ê¨Ò½Õ¥ÎÃþªº¤èªkÄݩʵ¥¤â¬q¨Ó¹ê²{³Ì²×ªº®ÄªG¡C©Ò¥H²Ä¤@¨B§Ú­Ì­º¥ý¤S¨Ó«Ø¥ß¤@­Óµøµ¡µ{¦¡Ãþ¡A¨ä¤¤¦@¦³¦¨­û¨ç¼ÆCreate©M Destroy¤À§O¥Î¨Ó³Ð«Ø©M¾P·´¤@­Ó§Ú­Ì«Ø¥ßªºµøµ¡µ{¦¡Ãþªº¹ê¨Ò¡C¦@¦³¦¨­û¨ç¼ÆWinCreate«h½Õ¥Î¨p¦³¦¨­û¨ç¼ÆWinRegister©M CreateMyWindow¨Óµù¥U©M³Ð«Øµøµ¡¡C¨ä¤¤ªºÄÝ©ÊÅܼÆApplicationName ©M WindowProcedure «h¬O¥Î¨ÓÀò±oµøµ¡µ{¦¡Ãþ¦W©Mµøµ¡®ø®§³B²z¨ç¼Æªº¡C¤U­±¬O­×§ï«áªº·½¥N½X¡G
//¥Î­±¦Vª«¥óªº¤èªk¨Ó½s¼g

program TMyWindowClass;
uses
Windows,
Messages,
SysUtils;

//³Ð«Øµ¡¤fÃþ

type
TMyWindow = class ( TObject )
private
{ ©w¸q¨p¦³ÅÜ¼Æ }
WindowClass : WndClass;
hWindow : HWnd ;
AMessage : TMsg ;
FAppName : String ;
FWndProc : TFNWndProc ;
function WinRegister : Boolean ; virtual ;
procedure CreateMyWindow ;
public
{©w¸q¤½¦³ÅÜ¼Æ }
constructor Create ;
destructor Destroy ; override ;
procedure WinCreate ; virtual ;
procedure Run ;
{©w¸qÄÝ©Ê }
property ApplicationName : String read FAppName write FAppName ;
property WindowProcedure : TFNWndProc read FWndProc write FWndProc ;
end ;
const
¡@AppName = ' MyClassshili ' ;
var
¡@myWindow : tMyWindow ;
¡@{ TMyWindowÃþ¤¤¤½¦³¨ç¼Æªº¹ê²{ }
¡@constructor TMyWindow . Create ;
¡@begin
end ;

destructor TMyWindow . Destroy ;
begin
¡@inherited ;
end ;

procedure TMyWindow . CreateMyWindow ; //³Ð«Øµ¡¤f
begin
¡@hWindow : = CreateWindow ( AppName , ' hello , world ' ,ws_OverlappedWindow , cw_UseDefault , cw_UseDefault ,
cw_UseDefault , cw_UseDefault , 0 , 0 , system . MainInstance , nil ) ;

¡@if hWindow <> 0 then begin
¡@¡@ShowWindow ( hWindow , CmdShow ) ;
¡@¡@ShowWindow ( hWindow , SW_SHOW ) ;
¡@¡@UpdateWindow ( hWindow ) ;
¡@end ;
end ;

procedure TMyWindow . WinCreate ;
begin
¡@if WinRegister then
¡@begin
¡@¡@CreateMyWindow ;
¡@end ;
end ;

function TMyWindow . WinRegister : Boolean ; //µù¥Uµøµ¡Ãþ
begin
¡@WindowClass.Style : = cs_hRedraw or cs_vRedraw ;
¡@WindowClass . lpfnWndProc : = FWndProc ;
¡@WindowClass . cbClsExtra : = 0 ;
¡@WindowClass . cbWndExtra : = 0 ;
¡@WindowClass . hInstance : = system.MainInstance ;
¡@WindowClass . hIcon : = LoadIcon ( 0 , idi_Application ) ;
¡@WindowClass . hCursor : = LoadCursor ( 0 , idc_Arrow ) ;
¡@WindowClass . hbrBackground : = GetStockObject ( WHITE_BRUSH ) ;
¡@WindowClass . lpszMenuName : = nil ;
¡@WindowClass . lpszClassName : = PChar ( FAppName ) ;
¡@Result : = RegisterClass ( WindowClass ) <> 0 ;
end ;

function WindowProc ( Window : HWnd ; Amessage : UINT ; WParam : WPARAM ;
LParam : LPARAM ) : LRESULT ; stdcall ; export ;

//®ø®§³B²z¨ç¼Æ
var
¡@dc : hdc ;
¡@ps : TPaintStruct ;
¡@r : TRect ;
begin
¡@WindowProc : = 0 ;
¡@case AMessage of
¡@¡@WM_PAINT :
¡@¡@begin
¡@¡@¡@dc : = BeginPaint ( Window , ps ) ;
¡@¡@¡@GetClientRect ( Window , r ) ;
¡@¡@¡@DrawText ( dc , ' hello , world ! ! ' , -1 , r ,
¡@¡@¡@DT_SINGLELINE or DT_CENTER or DT_VCENTER ) ;
¡@¡@¡@EndPaint ( Window , ps ) ;
¡@¡@¡@Exit ;
¡@¡@end ;
¡@¡@wm_Destroy :
¡@¡@begin
¡@¡@¡@PostQuitMessage ( 0 ) ;
¡@¡@¡@Exit ;
¡@¡@end ;
¡@end ;

¡@WindowProc : = DefWindowProc ( Window , AMessage , WParam , LParam ) ;
end ;

procedure TMyWindow . MyRun ;
begin
¡@while GetMessage ( AMessage , 0 , 0 , 0 ) do begin
¡@¡@TranslateMessage ( AMessage ) ;
¡@¡@DispatchMessage ( AMessage ) ;
¡@end ;
¡@Halt ( AMessage . wParam ) ;
end ;

//¥Dµ{§Ç¡Aµ{¦¡¹B¦æªº¶i¤J¤f
begin
¡@myWindow : = TMyWindow . Create ;
¡@myWindow . ApplicationName : = AppName ;
¡@myWindow . WindowProcedure : = TFNWndProc ( @WindowProc ) ;
¡@myWindow . WinCreate ;
¡@try
¡@¡@myWindow . MyRun ;
¡@¡@finally
¡@¡@FreeAndNil ( myWindow ) ;
¡@end ;
end .

¡@¡@¦n¤F¡A´N³o¨Ç§a¡C¬Û«H¦³¤F³o¨Ç°ò¦À³¸Ó¦b¬Ýdelphi·½¥N½X®É®e©ö¤F³\¦h¡A²¦³º«Ü¦h¥N½X¦b¦¹³£«Ü¼ô±x¤F¡C

³d¥ô½s¿è: ­·ÀH¦æ