¬Û«H¦U¦ìŪªÌ´¿¸g¨Ï¥Î¸ê·½´yzÀɨӴyz¹ï¸Ü²°ùتº±±¨î¤¸¥ó¦w±Æ¤è¦¡¡A¬Û«H¦U¦ìŪªÌ¤]¤w¸gª`·N¨ì¤F¡A¦b¹ï¸Ü²°ùتº¤å¦r¤j¤p¡A¨Ã¤£¬O¥H¹Ï¯À¬°³æ¦ì¡A¨º»ò¥¦»P¹Ï¯À¨s³º¦³¦óÃö«Y©O¡H¡C¨Æ¹ê¤W¤£¥u¬O¸ê·½´yzÀÉùعï¸Ü²°ªº¦r§Î¤j¤p¡A¦b³\¦h¤å®Ñ³B²z³nÅé¡A¦p UltraEdit-32¡BWORD¡B°O¨Æ¥»µ¥³nÅ骺¦r§Î¤j¤p¡A¤]³£¤£¬O¥H¹Ï¯À¬°³æ¦ì¡C¨Ò¦p¤U¹Ï¬O¦b°O¨Æ¥»ùØ¡A¿ï¾Ü¡yCourier New¡z¦r«¬¡A¤j¤p¬°¡y10¡z¡A¦ý¬O¹ê»Ú¤W³o¨Ç¤å¦rªº¤j¤p¨Ã«D 10 ӹϯÀªº¤j¤p ( ¦¹³Bªº¹Ï¯À¬O«ü pixel¡A¥Î¥H¥N´À¿Ã¹õ¤WªºÂI¡A¦Ó¤å¦rªº¤j¤p«h¥H¡yÂI¡zªí¥Ü¡A³o½g¤å³¹ùس£¿í¦u³oÓ¬ù©w )¡C¥¦Ì¦b¤p¤ì°¸ªº 19 ^¤o²G´¹¿Ã¹õ¤W¤j¤p¬O 16¡Ñ16 ¹Ï¯À¤j¡A¤]¥i¥H»¡¡A§Ú¦pªG¿ï¾Ü¡y10¡zÂI¦r¡A¦ý¬O¦b¿Ã¹õ¤W«o¬O¥H 16 ӹϯÀ¨Óªí¥Ü¡C
¦b Windows §@·~¨t²ÎùØ¡A¿Ã¹õ¤Wªº¤å®Ñ³B²zµ{¦¡¿ï¾Ü 10 ÂIªº¤å¦r¤j¤p®É¡A§Ṳ́]·|§Æ±æ¦b¦C¦L®É¡A¦L¥Xªº¤å¦rÁÙ¬O 10 ÂIªí¥Ü¡C¦ý¬O§Ú̪¾¹D¿Ã¹õªº¸ÑªR«×»P¦Lªí¾÷ªº¸ÑªR«×¬O¤£¦Pªº ( ¦¹³Bªº¸ÑªR«×¬O«ü¨C^¤o¦³´XӹϯÀ )¡A¤@¯ë²G´¹¿Ã¹õªº¸ÑªR«×¬O¨C^¤o¬ù 86 ӹϯÀ¡F¦ý¬O¹p®g¦Lªí¾÷¨C^¤o«o¥i¹F 600 ¹Ï¯À¡A¨âªÌ¬Û®t¤F 7 ¿¤§¦h( µù¤@ )¡A°²¦p Windows §@·~¨t²Îùتº¤å¦r¤j¤p 10 ÂI´N¬O¦b¿Ã¹õ¤Wªº 10 ӹϯÀ¡A¤]¬O¦b¦Lªí¾÷¤Wªº 10 ӹϯÀ¡A¨º»ò¦b¿Ã¹õ¤W¥i¥H«Ü²M·¡±o¿ëÃÑ 0.4 ¤½¤À°ª¡B0.4 ¤½¤À¼eªº¦r¡A¦b¦Lªí¾÷¦L¥X¨Óªº¦r¼e»P°ª«oÅܦ¨¤F 0.057 ¤½¤À ( 0.4¡Ò7¡Ü0.057 )¡A³o¼Ë¦L¥X¨Óªº¦r¤Ó¤p¤F¡A®Ú¥»¬Ý¤£²M·¡¡C
´«¥y¸Ü»¡¡A¦]¬°¹p®g¦Lªí¾÷ªº¸ÑªR«×¬O¨C^¤o 600 ¹Ï¯À¡A¨ä¹Ï¯À«Ü¤p¡F¦Ó²G´¹¿Ã¹õ¸ÑªR«×¬O¨C^¤o 86 ¹Ï¯À¡A¨ä¹Ï¯À¸û¤j¡C¤]´N¬O»¡¡A¹p®g¦Lªí¾÷ªº¨CӹϯÀ¤j¤p¡A¤j¬ù¬O²G´¹¿Ã¹õªº¤C¤À¤§¤@¥ª¥k¡C¦pªG§@·~¨t²Î§â 10 ÂIªº¦r³£·í§@ 10 ӹϯÀ¡A¦Ó¥B¦P®ÉÀ³¥Î¦b²G´¹¿Ã¹õ©Î¹p®g¦Lªí¾÷¤W¡A¨º»ò¦b¿Ã¹õ¤W¬Ý±o«Ü²M·¡ªº¦r¡A¦L¥X¨Ó´N·|¤p¨ìÁY¦¨¤@¹Î¦Ó¬Ý¤£²M·¡¡F©Î¬O¦Lªí¾÷¦L¥X¨Ó¾A·í¤j¤pªº¦r¡A¦b¿Ã¹õÅã¥Ü¤W«o¬O¤j¨ì¿Ã¹õ¤W¥u¯àÅã¥Ü´XÓ¦r´N®e¯Ç¤£¤U¤F¡C
¥Ñ¥H¤Wªº»¡©ú¡A§ÚÌÀ³¸Ó¥i¥H©úÁA¡AÁöµM¦P¼Ë¬O 10 ÂI¦r¡A¦b¤£¦P¸ÑªR«×ªº©PÃä³]³Æ¤W©Ò¨Ï¥Îªº¹Ï¯À¦h¹è¬O¤£¦Pªº¡CµM¦Ó¡A¦b¤@¯ë¶Ç²Î¹]¦r¦L¨êùØ¡A¨C^¤o¥i¥H®e¯Ç 72 ÂI¡A³oÓȬO¦b¹q¸£¡B¦Lªí¾÷µ¥¥¼µo©ú¤§«e´N¤w¸g¨Ï¥Î¤F¼Æ¦Ê¦~¡A¹q¸£µo©ú«á¡A§Ṳ́]¿í¦u³o¶µ¶Ç²Î¡C©Ò¥H¦b¶Ç²Î¹]¦r¦L¨êùØ¡A10 ÂI¦rªº°ª«×¬O
^¤o¡C§Ṳ́]§Æ±æ¯à¦b¿Ã¹õ¤W¡A¯àÅã¥Ü 10 ÂI¦r¤]¬O
^¤o¡A¬°¤F¹F¨ì³oӥتº¡A¦b Windows §@·~¨t²ÎùØ¡A§ÚÌ¥i¥H¥Î GetDeviceCaps ¨Ó¨ú±o©PÃä¸Ë¸mªº¸ÑªR«×¡A¥Îªk¬O¡G
int GetDeviceCaps(
HDC hdc, // device-context handle
int nIndex // index of capability to query
);
³oÓ API º¥ý±o¨ú±o¸Ó©PÃä¸Ë¸mªº³]³Æ¤º®e ( device context )¡A¦pªGn¨ú±o¤ô¥¤è¦Vªº¸ÑªR«× ( ¦¹³Bªº¸ÑªR«×¬O¨C^¤o¦³¦h¤Ö¹Ï¯À )¡AnIndex °Ñ¼Æ³]¬° LOGPIXELSX ¡F¦pªGn¨ú±o««ª½¤è¦Vªº¸ÑªR«×¡A´N¨Ï nIndex ³]¬° LOGPIXELSY ¡A±µµÛ©I¥s GetDeviceCaps ´N¥i¥H¤F¡CnIndex °Ñ¼Æ¤£¥u³o¨âÓ¡AÁÙ¥i¥H¥Î¨ä¥L°Ñ¼Æ¡A¨Ò¦p¥Î HORZRES¡BVERTRES ¥i¥H¨ú±o¤ô¥¼e«×©M««ª½°ª«×¦³¦h¤Ö¹Ï¯À¡F¥Î HORZSIZE¡BVERTSIZE ¥i¥H¨ú±o¤ô¥¼e«×©M««ª½°ª«×¦³¦h¤Ö²@¦Ìµ¥µ¥¡A¨ä¥LÁÙ¦³³\¦h¥Îªk¡A¥i¥H°Ñ¦Ò MSDN¡C
¦³¤F¥H¤WªºÆ[©À¤§«á¡A§ÚÌ´N¥i¥Hºâ¥X¦b¤£¦P©PÃä¸Ë¸m¤¤¡A¤£¦P¤å¦rÂIȩҦû¥Îªº¹Ï¯À¤j¤p¡A³oÓȵ¥©ó¸Ó¤å¦r¦³¦h¤Ö^¤o¡A¦A¼¥H¸Ó©PÃä¸Ë¸mªº¸ÑªR«×¡F¦Ó¤å¦r¦³¦h¤Ö^¤o´N¬O¸Ó¤å¦rªºÂI¼Æ°£¥H 72¡A¦pªG¥H¼Æ¾Ç¦¡ªí¥Ü¡A´N¬O¤U±ªº¦¡¤l¡G
![]()
¤p¤ì°¸§Q¥Î¤W±©Ò»¡ªºì²z¡A¼¶¼g¤@Ó¸U¦~¾äµ{¦¡¡yperpetual calendar.asm¡z¡A¥¦¬O¤@Ó¥H¹ï¸Ü²°¬°¥Dn¬É±ªºµ{¦¡¡A¨Ï¥ÎªÌ¥i¥H«ö¥D¿ï³æùتº¡y©ñ¤j¡z©Î¡yÁY¤p¡z¿ï¶µ¨Ó©ñ¤j©ÎÁY¤p¦r§Î¡A¦Ó¦¹¹ï¸Ü²°¯à°÷¦Û°Êpºâ©Ò»Ýªº¤j¤p¡A½Õ¾ã¹ï¸Ü²°¤j¤p¡A¤£P·|ºIÂ_«á±ªº¤å¦r¡C

³oÓµ{¦¡³B²z WM_INITDIALOG °T®§®É¡A¨ú±o¤F¤@¨Ç¸ê®Æ¡A¨Ò¦p¿Ã¹õ¼e«×¡B°ª«×¡B·í«e®É¶¡¡A¥H¤ÎÀRºA±±¨î¶µ¡B½s¿è®Ø¡B½Æ¦X®Ø¤Î¨âÓ«ö¶sªº¥N½X¡A±µµÛ³Ì«nªº´N¬O©I¥s°Æµ{¦¡¡ACalcFont¡A¨Ópºâ¦r§Î¤j¤p¡C»P¨ú±o®É¶¡¦³Ãöªº API ¦³¨âÓ¡A¤À§O¬O GetLocalTime ©M GetSystemTime¡A»¡©ú¦p¤U¡G
¦b Win32 API ùØ¡A¥i¥H§Q¥Î GetSystemTime ¨ÓÀò±o¨t²Î®É¶¡¡A¦Ó³oÓ¨t²Î®É¶¡´N¬O¨ó½Õ¥@¬É®É¶¡ ( Coordinated Universal Time¡AÁY¼g¦¨¡yUTC¡zµù¤G )¡F¦Ó GetLocalTime API ¬O¥Î¨ÓÀò±o·í¦aªº®É¶¡¡C§Ú̪ºµ{¦¡©I¥s³o¨âÓ API ®É¡A±o§â SYSTEMTIME µ²ºcÅ骺¦ì§}¶Çµ¹¨t²Î¡A¦Ó¨t²Î·|§â SYSTEMTIME µ²ºcÅé¶ñ¦n¶Ç¦^¨Ó¡A¥¦Ì³£¨S¦³¶Ç¦^È¡A¨ä»yªk¬O¡G
VOID GetLocalTime(
LPSYSTEMTIME lpSystemTime // address of system time structure
);
SYSTEMTIME µ²ºcÅ骺¦UÄæ¦ì¤j¤p³£¬O¤@Ó¦r²Õ¡A³o»P¨ä¥L Win32 ¨Ï¥ÎªºÅܼơB±`¼Æ¤j¤p¤£¦P¡A³o¥i¯à¬O¦]¬°ªí¥Ü®É¶¡¥H¦r²Õ¨Óªí¥Ü¡A´Nºïºï¦³¾l¤F ( ¦r²Õ¥i¥Hªí¥Ü 0¡ã65535 ªº½d³ò )¡C©³¤U¬O SYSTEMTIME µ²ºcÅ骺¦UÄæ¦ì·N¸q¡G
SYSTEMTIME STRUC wYear WORD ? ;¦è¤¸¦~¥÷ wMonth WORD ? ;¤ë¡A1 ¬°¤@¤ë¡B2 ¬°¤G¤ë¡B3 ¬°¤T¤ë¡K¡K wDayOfWeek WORD ? ;¬P´Á´X¡A0 ¬°¬P´Á¤é¡B1 ¬°¬P´Á¤@¡B2 ¬°¬P´Á¤G¡K¡K wDay WORD ? ;¤é wHour WORD ? ;®É¡A±Ä¥Î 24 ®É¨î¡A¥Ñ 0¡ã23 wMinute WORD ? ;¤À wSecond WORD ? ;¬í wMilliseconds WORD ? ;²@¬í¡A±q 0¡ã999 SYSTEMTIME ENDS
±µ¤U¨Ó¡A¦b WM_INITDIALOG °T®§ùØ©I¥s CalcFont °Æµ{¦¡¡A³oӰƵ{¦¡°µ¤F¥|¥ó¨Æ¡C²Ä¤@¬O¨Ì¾Ú¦r§Îªº¤j¤p¡AdwDlgFontSize¡Aºâ¥X¦rÅ骺°ª«×¦û¦³´XӹϯÀ¡A¦s¤J dwFontHigh¡AµM«á¨Ì¾Ú dwFontHigh ©I¥s CreateFont «Ø¥ßÅÞ¿è¦r§Î¡A¦A¥Î GetTextMetrics ¨ú±o¦r§Î¼e«×¦û¦³´XӹϯÀ¡A¦s¤J dwFontWidth ÅܼơC³o¼Ë¡Aµ{¦¡´N¤w¸g¨ú±o¦r§Îªº°ª«×»P¼e«×¦³¦h¤Ö¹Ï¯À¡C°²¦p¨Ï¥ÎªÌ§ó°Ê¤F¦r§Î¤j¤p¡A¨º»ò´N·|¼vÅT¾ãÓµøµ¡ª©±¡A¥]§t¦U±±¨î¶µªº¤j¤p¤Î¦U±±¨î¶µ¦b¹ï¸Ü²°ªº¦ì¸m³£·|§ïÅÜ¡A³o¥ó¨Æ¥Ñ©I¥s CalcCtlPosi °Æµ{¦¡§¹¦¨¡A³o¬O CalcFont °Æµ{¦¡ªº²Ä¤G¶µ¤u§@¡CCalcFont °µªº²Ä¤T¥ó¨Æ¬O¨Ì¾Ú¦r§Î¤j¤p¡Apºâ¹ï¸Ü²°ªº¤j¤p¤Î§â¹ï¸Ü²°²¾¨ì¿Ã¹õ¤¤¥¡¡CCalcFont °Æµ{¦¡ªº³Ì«á¤@¶µ¤u§@«K¬O§â·s«Ø¥ß§¹¦¨ªºÅÞ¿è¦r§Î¿ï¤J¦U±±¨î¶µùØ¡C
¦¹³Bȱo¤@´£ªº¬O¡An§ïÅܹï¸Ü²°ùتº¦r§Î¡A¥i¥H¥Î SelectObject¡F¦ý³o¤@©Û¦ü¥G¹ï±±¨î¶µµL®Ä¡A§Y¨Ï¤p¤ì°¸´¿¸g¨ú±o±±¨î¶µªº¸Ë¸m¤º®e¥N½X¡A¦A¥H SelectObject §ïÅܨä¦r§Î¤]µLªk¦¨¥\¡C¤£¹L§ÚÌÁÙ¬O¥i¥HÂÇ¥Ñ SendMessage µo°e WM_SETFONT °T®§µ¹¬YÓ±±¨î¶µ¡A¨Ï¨äÅܧó¦r§Î¡A¦¹®É wParam ¬O¦r§Î¥N½X¡AlParam ¬O¥Î¨Ó«ü¥Ü±±¨î¶µ¦b§ïÅܦr§Î«á¬O§_¥ß§Y«Ã¸¦r§Î¡ATRUE ªí¥Ü¥ß§Y«Ã¸¡AFALSE ªí¥Ü§_¡C¨ì¦¹ºâ¬O¤w³B²z§¹ WM_INITDIALOG °T®§¡C
·í¨Ï¥ÎªÌ«ö¤U¥D¿ï³æ¤¤ªº¡yÁY¤p¡z©Î¡y©ñ¤j¡z¿ï¶µ®É¡AdwDlgFontSize ·|¦b 8 ¨ì 24 ªº½d³ò¤ºÀH¤§´î¤@©Î¼W¤@¡A±µµÛ©Ò°µªº¨Æ«K¬O©I¥s CalcFont °Æµ{¦¡««·spºâ¦rÅé°ª«×¡Bpºâ¦U±±¨î¶µ¤j¤p¤Î¦ì¸m¡Bpºâ¹ï¸Ü²°¤j¤p¨Ã²¾¦Ü¿Ã¹õ¤¤¥¡¡B¹ï¹ï¸Ü²°¿ï¤J·sªºÅÞ¿è¦r§Î³o¥|¥ó¨Æ¡A³Ì«á¬O©I¥s InvalidateRect ³]©w¹ï¸Ü²°»Ýn«·sø¹Ï¡C
µM«á¦b WM_PAINT °T®§ùØ¡A©I¥s DrawCalendarTbl °Æµ{¦¡¡A³B²zø¥X¸Ó¤ë¥÷ªº¤ë¾ä¡C¦b¦¹¤ë¾äªº²Ä¤@¦C ( ¥Ñ¥ª¦Ó¥kºÙ¬°¦C ) ¬O¬P´Á¡y¤é¡B¤@¡B¤G¡K¡K¡zµ¥¤å¦r¡A³o¨Ç¤å¦r¥HI´º¬°¶À¦â¡A·í°µÄæ¦ì¡C¦p¤U¹Ï©Ò¥Ü¡A¨CÓ¤å¦r³£¬O¥H DrawText ¿é¥X¦Ü³]³Æ¤º®e¡G

¥Ñ¤W¹Ï¤¤¯à°÷¬Ý±o¥X¨Ó¡A¨CӰŵô¯x§Î¥ª¤W¨¤¤ô¥¤è¦V¬Û¶Z¨âÓ¦r¤¸ªº¼e«× ( ¹Ï¤¤ w ªí¥Ü¤@Ó¦r¤¸¼e )¡A¦Ó¤W¤U¤è¦V«h¬O¬Û¶Z¤@Ó¥b¦r¤¸¼e«× ( ¹Ï¤¤ h ªí¥Ü¤@Ó¦r¤¸°ª )¡A
DrawText ¬O¥Î¨Ó§â¦r¦ê¥H«ü©wªº¤è¦¡Åã¥Ü¦b¬YÓªº°Ï°ì¤º¡A¨ä쫬¬°¡G
int DrawText(
HDC hDC, // handle to device context
LPCTSTR lpString, // pointer to string to draw
int nCount, // string length, in characters
LPRECT lpRect, // pointer to structure with formatting dimensions
UINT uFormat // text-drawing flags
);
DrawText ·|§â¦r¦êÅã¥Ü¦b°Åµô¯x§Îªº²Ä¤@¦æ¡A¦pªG¦r¦ê§t¦³´«¦æ¦r¤¸ ( linefeed ) ¤ÎÂk¦ì¦r¤¸ ( carriage return )¡A¨º»ò´N·|´«¨ì¤U¤@¦æÄ~ÄòÅã¥Ü¡A§ÚÌ¥i¥H¥Î DT_LEFT¡BDT_RIGHT¡BDT_CENTER «ü©w¦V¥ª¡B¥k¡B¤¤¶¡¹ï»ô¡A·í DrawText ´«¦æ®É¡A¨C¦æ°ª«×¬O tmHeight¡A¦æ¶Z¤£¥]§t tmExternalLeading ( °Ñ¦Ò TEXTMETRIC µ²ºcÅé )¡A¦pªGn¦æ¶Z¥]§t¥~³¡¶¡¶Z¡A¥i¥H¨Ï¥Î DT_EXTERNALLEADING¡C
uFormat °Ñ¼Æ¥i¥H¥Î DT_SINGLELINE Åã¥Ü¤@¦æ¦r¦ê¡A§Y¨Ï¦r¦ê¥]§t´«¦æ©ÎÂk¦ì¦r¤¸¡ADrawText ¤]·|§â³o¨âÓ¦r¤¸·í°µ¤@¯ë¤å¦rÅã¥Ü¦b¿Ã¹õ¤W¡C¦b¦³ DT_SINGLELINE ªº±¡§Î¤U¡A¤]¥i¥H·f°t DT_TOP¡BDT_BOTTOM¡BDT_VCENTER ¨Ó¨Ï¦r¦ê¦ì©ó°Åµô¯x§Îªº³»ºÝ¡B©³ºÝ©Î««ª½ªº¤¤¶¡¡A¤º©wȬO DT_TOP¡C¤p¤ì°¸³oÓ¸U¦~¾äµ{¦¡§â¬P´Á¡y¤é¡B¤@¡B¤G¡K¡K¡zµ¥¤å¦r¤À¤C¦¸©I¥s DrawText¡A¨CӰŵô¯x§Î¼e«×¬O¤@Ó¥b¦r¤¸¼e ( ¹Ï¤¤¥H w ªí¥Ü¤@Ó¦r¤¸¼e¡A¥H h ªí¥Ü¤@Ó¦r¤¸°ª¡A¹Ï¤¤¤]¥HÂŦâ¯x§Î¼Ð¥Ü°Åµô¯x§Î¡A¦Ó°Åµô¯x§Îùرªººñ¦â¯x§Î¬O¤å¦r®Ø )¡A¦Ó¤å¦r«h¬OÅã¥Ü¦b°Åµô¯x§Î¤¤¥¡ ( ¨Ï¥Î¤F DT_CENTER )¡A©Ò¥H¦b¤å¦r¨âÃä¦U¯d¦³¥|¤À¤§¤@¼e¦r¤¸¡C
¤£ºÞ¬O¦h¦æ©Î³æ¦æ¦r¦ê¡A¦pªG°Åµô¯x§Îªº¼e«×¤Ó¤p©Î¦r¦ê¤Óªø¡A³£·|¨Ï¦r¦ê¥kÃä³QºI±¼¡A³o®É uFormat ¥i¨Ï¥Î DT_NOCLIP¡A¨Ï¦r¦ê¤£¨ü°Åµô¯x§Îªº¨î¦Ó¶W¥X°Åµô¯x§Î¡F¦]¬° DT_NOCLIP ¤£¶·pºâ°Åµô¯x§Îªº½d³ò¡A©Ò¥HÅã¥Ü³t«×·íµM·|¥[§Ö¡C¦ý¦pªG·Qn¦b°Åµô¯x§Îªº½d³ò¤º¡A§â¶W¥Xªº³¡¥÷¤@¨ì¤U¤@¦æÅã¥Ü¡A¥i¥H¨Ï¥Î DT_WORDBREAK¡C
DrawText ÁÙ·|§â¡y&¡z¦r¤¸µø¬°«e¸m¦r¤¸¡A¦b¦¹¦r¤¸¤§«áªº¦r¥[¤W©³½u¡A¦Ó¤£·|Åã¥Ü¡y&¡z¡F¦pªGnÅã¥Ü¡y&¡z¦r¤¸±o¨Ï¥Î¡y&&¡z¡C©ó¬O¦³©³¤U¤TºØ¥Îªk¡G
¦pªG uFormat ¨Ï¥Î¤F DT_CALCRECT¡A¨º»ò DrawText ¨Ã¤£·|§â¦r¦êµe¥X¨Ó¡A¦Ó¬Opºâ©Ò»Ýnªº°Åµô¯x§Î³Ì¤pªº¤j¤p¡AµM«á¶ñ¤J lpRect ©Ò«üªº RECT µ²ºcÅ餺¡A³oÓ¥\¯à¥i¥H¦b¤£ª¾°Åµô¯x§Îªº¤j¤p®É¨Ï¥Î¡A¥ý¨Ï¥Î DT_CALCRECT ¬°°Ñ¼Æ©I¥s DrawText pºâ¦n°Åµô¯x§Î¤§«á¡A¦A©I¥s¤@¦¸ DrawText ¯u¥¿ªºÃ¸¥X¤å¦r¨Ó¡Aºâ«Ü±`¥Îªº¥\¯à¡C°²¦p³oÓ¦r¦ê¬O¤@¦æªº¤å¦r¡A¨º»òµ{¦¡³]p®vÀ³¥ý³]©w¦n°Åµô¯x§Îªº¥ª¤W¨¤®y¼Ð¡A¥ç§Yn¥ý¶ñ¦n top ©M left Äæ¦ì¡AµM«á¥H DT_CALCRECT or DT_SINGLELINE ©I¥s DrawText¡ADrawText ªð¦^®É·|§â°Åµô¯x§Îªº bottom ©M right ¶ñ¦n¡C°²¦p³oÓ¦r¦ê¬O¦h¦æ¤å¦r¡A¨º»òµ{¦¡³]p®v°£¤F top ©M left n¥ý¶ñ¦n¥~¡AÁÙ±o«ü©w right¡A§@¬°¨C¤@¦Cªº¼e«×¡A³o¼Ë DrawText ¤~¯à¨M©w¦¹¦r¦ê¦û¦³´X¦C¤å¦r¡A¶i¦Ó¨M©w°Åµô¯x§Îªº°ª«×¡A¦Ó¶Ç¦^ªº bottom ¼ÆÈ¬O°Åµô¯x§Î°ª«×¥[¤Wì¥ý³]©wªº top¡C
DrawText Áö¥i¥H³B²z³\¦hºØª¬ªpªº¦r¦ê¡A¦ý¬O¤´µMµLªk§ïÅܤå¦rÃC¦â¥H¤Î¤å¦r®ØªºI´ºÃC¦â¡C¦b Windows ¨t²ÎùØ¡An§ïÅܤå¦rÃC¦â¶·¨Ï¥Î SetTextColor ¡An§ïÅܤå¦r®ØªºI´ºÃC¦â¡A¥i¥H¥Î SetBkColor¡C½Ð°Ñ¦Ò¤W¹Ï¡ASetBkColor ¥u¯à§ïÅܤå¦r®Ø ( ¥Hºñ¦â¯x§Î®Ø¦íªº³¡¥÷ ) ªºI´ºÃC¦â¡A¦Ü©ó¤å¦r®Ø¥~ªº³¡¥÷¥²¶·¥t¥~³]ªk¡C¦b¸U¦~¾ä³oÓµ{¦¡ùØ¡A¤p¤ì°¸¨Ï¬P´Á¡y¤é¡B¤@¡B¤G¡K¡K¡zµ¥¤å¦rI´º³]¬°¶À¦â¡A¥H¥YÅ㥦̬OÄæ¦ì¡A³oùؤp¤ì°¸¬Oµe¥X¤@Ó¶ñº¡¶À¦âªº¯x§Î¡AµM«á¦A¥H SetBkColor ³]©w¤å¦r®ØI´º¬°¶À¦â¡C¶¶±a¤@´£¡An¨ú±o¤å¦r®ØªºI´ºÃC¦â¡A¥i¥H¥Î GetBkColor¡C
±ýµe¥X¤@Ó¶ñº¡ªº¶À¦â¯x§Î¡A¥i¥H¥Î FillRect API¡A¦b¦¹¤§«e¡A±o¥ý¥Î CreateSolidBrush «Ø¥ß¤@Ó¶À¦âªºµ§¨ê¡ACreateSolidBrush ·|¶Ç·|¤@Óµ§¨ê¥N½X¡F±µµÛ¦A¥Î SelectObject ¿ï¾Ü¦¹µ§¨ê¡AFillRect ´N·|¥H³oÓµ§¨ê¶ñº¡¯x§Î¡C
°²¦p¤w¸g¦b¬P´Á¡y¤é¡B¤@¡B¤G¡K¡K¡zµ¥Äæ¦ì¤Wµe¤W¶îº¡ÃC¦âªº¶À¦â¯x§Î¡A§Ṳ́]¥i¥H³]©wI´º¼Ò¦¡¬°³z©úªº¡A³o¼Ë¨t²Î´N¤£·|§â¤å¦r®ØªºI´º¶îº¡ÃC¦â¡C¨Æ¹ê¤WI´º¼Ò¦¡¥u¦³¨âºØ¥i¥H¿ï¾Ü¡GTRANSPARENT¡BOPAQUE¡A«eªÌ¬O³z©ú¼Ò¦¡¡A«áªÌ¬O¥H²{¦bªºI´ºÃC¦â§â¤å¦r®Ø¶îº¡¡CSetBkMode »yªk¬O¡G
SetBkMode(
HDC hdc, // handle of device context
int iBkMode // flag specifying background mode
);
·í Windows ¦b³]³Æ¤º®eø¥X¤å¦r®É¡A¬O¥H¤º©wªºµeµ§Ã¸¥X¤å¦rªº«e´ºÃC¦â¡A¤]¥Î¤º©wªºµ§¨êø¥XI´ºÃC¦â¡C¦p¤W¹Ï©Ò¥Ü¡A¬O¤ë¾äªº²Ä¤@¦C¬P´Á¡y¤é¡B¤@¡B¤G¡K¡K¡zªº©ñ¤j¹Ï¡C¤å¦rªº«e´ºÃC¦â¬O¥Î³]©w¡An¦Ó¥t¥~ÁÙ¦³¤@Ó¤èªk¡A¥i¥H³]©w¤å¦r®ØªºI´º¬°³z©ú¼Ò¦¡¡A³o¼Ë¤å¦r®ØªºÃC¦â¤£·|Åã¥Ü¥X¨Ó¡A´N¥u·|Åã¥Ü¥X¹ï¸Ü²°ªºÃC¦â¡C©³¤Uªº SetBkMode ´N¬O¥Î¨Ó³]©wI´º¼Ò¦¡¡C
©³¤U¬O perpetual_calendar.asm ªºì©l½X¡G
;perpetual calendar¸U¦~¾ä¡G¦¹µ{¦¡§Q¥Î¼Ò¦¡¹ï¸Ü²°¬°¬É±ªºÀ³¥Îµ{¦¡
;¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¿é¤J¦è¤¸´X¦~´X¤ë¡A·|§â¸Ó¤ëªº¤ë¾ä¦L¦b¤u§@°Ï
.586
.model flat,stdcall
option casemap:none
include windows.inc
include user32.inc
include kernel32.inc
include gdi32.inc
includelib user32.lib
includelib kernel32.lib
includelib gdi32.lib
IDC_EDIT equ 100
IDC_COMBOBOX equ 101
IDC_STATIC0 equ 102
IDC_STATIC1 equ 103
IDC_STATIC2 equ 104
IDC_BUTTON0 equ 105
IDC_BUTTON1 equ 106
IDM_EXIT equ 107
IDM_LARGE equ 108
IDM_SMALL equ 109
IDM_CLEAR equ 110
IDM_HELP equ 111
DLGFONTSIZE equ 12
FIELDBKCOLOR equ 0ffffh ;Äæ¦ìI´ºÃC¦â¶À¦â
TODAYBKCOLOR equ 0ff00h ;¤µ¤éªºI´º¥Hºñ¦âªí¥Ü
;*******************************************************************************
.const
dwHalf DWORD 0.5
wTen WORD 10
w72 WORD 72
szDlgName BYTE 'CalendarDlg',0
szFontFace BYTE '·s²Ó©úÅé',0
szMonth BYTE '¤@',0,'¤G',0,'¤T',0,'¥|',0,'¤',0,'¤»',0
BYTE '¤C',0,'¤K',0,'¤E',0,'¤Q',0,'¤Q¤@',0,'¤Q¤G',0
szWeek BYTE '¤é',0,'¤@',0,'¤G',0,'¤T',0,'¥|',0,'¤',0,'¤»',0
szFmt0 BYTE '%04d',0
szFmt1 BYTE '%2d',0
szFmt2 BYTE '²{¦b±z¿ï¥Îªº¦r§Î¤j¤p¬° %2d ÂI¡C',0
nDayOfMonth BYTE 31,28,31,30,31,30,31,31,30,31,30,31
szIcon BYTE 'CalendarIcon',0
szTitle BYTE '²{¦b¦r§Î¤j¤p',0
;*******************************************************************************
.data
hInstance HINSTANCE ?
hDialog HANDLE ?
hEdit HANDLE ?
hComboBox HANDLE ?
hBtn0 HANDLE ? ;¡y¬d¸ß¡z«ö¶sªº¥N½X
hBtn1 HANDLE ? ;¡yÂ÷¶}¡z«ö¶sªº¥N½X
hStatic0 HANDLE ? ;ÀRºA±±¨î¶µ¡y¦è¤¸¡zªº¥N½X
hStatic1 HANDLE ? ;ÀRºA±±¨î¶µ¡y¦~¡zªº¥N½X
hStatic2 HANDLE ? ;ÀRºA±±¨î¶µ¡y¤ë¡zªº¥N½X
hNewFont HFONT ?
dwDlgFontSize DWORD DLGFONTSIZE ;²Ä´X¸¹¦rÅé¡A¬Û·í©óOFFICEùتº¦r«¬¤j¤p
dwFontHigh DWORD ? ;¦rÅé°ª«×¡A¥H¹Ï¯À¬°³æ¦ì
dwFontWidth DWORD ? ;¦rÅé¼e«×¡A¥H¹Ï¯À¬°³æ¦ì
dwScrWidth DWORD ? ;¿Ã¹õ¼e«×¡A¥H¹Ï¯À¬°³æ¦ì
dwScrHigh DWORD ? ;¿Ã¹õ°ª«×¡A¥H¹Ï¯À¬°³æ¦ì
ptCalendarTbl POINT >
rectText RECT >
stLocTime SYSTEMTIME >
ps PAINTSTRUCT >
tm TEXTMETRIC >
szBuffer BYTE 40 dup (0)
;*******************************************************************************
.code
;-------------------------------------------------------------------------------
;¨D¦è¤¸EAX¦~ECX¤ë¤@¤é¬O¬P´Á´X
;ªð¦^®ÉEAX=¬P´Á´X
CalculateDate PROC USES ebx esi
LOCAL m:DWORD
mov esi,eax ;«O¦s¦~©óESIùØ
mov eax,14
sub eax,ecx
sub edx,edx
mov ebx,12
div ebx ;EAX=a=int((14-month)/12)
sub esi,eax
mul ebx
sub eax,2
add eax,ecx
mov ebx,100
mov m,eax ;EAX=month+12a-2
mov eax,esi
div ebx
mov esi,eax ;C=¥@¬ö=(year-a)ªº¤d¦ì¼Æ»P¦Ê¦ì¼Æ
shr esi,2
shl eax,1
sub esi,eax
add esi,edx
shr edx,2
inc esi
add esi,edx ;ESI=C/4-2C+Y+Y/4+D
mov eax,m
mov ecx,m
shl ecx,2
add eax,ecx
mov ebx,5
shl ecx,1
sub edx,edx
add eax,ecx
dec eax ;EAX=13m-1
div ebx
mov ecx,7
xor edx,edx
add eax,esi ;EAX=C/4-2C+Y+Y/4+D+int((13m-1)/5)
@@: cmp eax,0
jge positive
add eax,ecx
jmp @b
positive: div ecx
xchg eax,edx
ret
CalculateDate ENDP
;-------------------------------------------------------------------------------
;³]©w¦n¤å¦rÃC¦â»P°Åµô¯x§Î¡A¨CÓ¤¤¤å¦rªº°Åµô¯x§Î¬O¤@Ó¥b¦r¤¸¼e¡B¤@Ó¦r¤¸°ª
CalcTextRect PROC hdc:HDC,dwWeek:DWORD
.IF dwWeek==0
invoke SetTextColor,hdc,0ffh ;¬P´Á¤é¤å¦r¬õ¦â
.ELSEIF dwWeek==6
invoke SetTextColor,hdc,0ff0000h ;¬P´Á¤»¤å¦rÂŦâ
.ELSE
invoke SetTextColor,hdc,0 ;¶Â¦â
.ENDIF
mov ecx,dwFontWidth
shl ecx,1
mov eax,dwWeek
mul ecx
add eax,ptCalendarTbl.x
mov rectText.left,eax
add ecx,dwFontWidth ;ECX=¤@Ó¥b¦r²Õ¼e
mov rectText.right,eax
shr ecx,1
add rectText.right,ecx
ret
CalcTextRect ENDP
;-------------------------------------------------------------------------------
DrawCalendarTbl PROC hdc:HDC
LOCAL dwWeek:DWORD ;¬P´Á¤é¡G0¡A¬P´Á¤@¡G1¡A¬P´Á¤G¡G2¡A¡K¡K¬P´Á¤»¡G6
LOCAL dwYear:DWORD,dwMonth:DWORD,dwDay:DWORD
LOCAL nMaxDay:DWORD ;¸Ó¤ë¦³´X¤Ñ
LOCAL colorTextBk:DWORD
;³]©w¶ñº¡¶À¦âªº¯x§Î¤j¤p¡A¦s¤JrectTextùØ¡A¦¹¯x§Î¥ª¤W¨¤¦bptCalendarTbl³B¡A¼e13Ó¥b¦r¤¸¡A¤@Ó¦r¤¸°ª
mov edx,dwFontWidth
mov eax,edx
mov ecx,edx
shl edx,3
shl eax,2
add edx,ecx
add edx,eax
shr ecx,1
add edx,ecx ;EDX=13Ó¥b¦r¤¸¼e
mov eax,ptCalendarTbl.x
mov rectText.left,eax
add edx,eax
mov rectText.right,edx
mov ecx,ptCalendarTbl.y
mov rectText.top,ecx
add ecx,dwFontHigh
mov rectText.bottom,ecx
;µe¥X¬P´Á¡y¤é¡z¡B¡y¤@¡z¡ã¡y¤»¡zªºÄæ¦ìªºI´ºÃC¦â¡A§Y¶ñº¡¶À¦âªº¯x§Î
invoke CreateSolidBrush,FIELDBKCOLOR
push eax
invoke SelectObject,hdc,eax
invoke DeleteObject,eax
pop edx
invoke FillRect,hdc,OFFSET rectText,edx
;µe¥X¬P´Á¡y¤é¡z¡B¡y¤@¡z¡ã¡y¤»¡zªºÄæ¦ì¦W
invoke SelectObject,hdc,hNewFont
invoke DeleteObject,eax
invoke SetBkColor,hdc,FIELDBKCOLOR
mov dwWeek,0
mov edx,ptCalendarTbl.y
mov rectText.top,edx
add edx,dwFontHigh
mov rectText.bottom,edx
@@: invoke CalcTextRect,hdc,dwWeek
mov ecx,dwWeek
shl ecx,1
add ecx,dwWeek
add ecx,OFFSET szWeek
invoke DrawText,hdc,ecx,-1,OFFSET rectText,DT_CENTER or DT_VCENTER or DT_SINGLELINE
mov ecx,dwFontWidth
inc dwWeek
shl ecx,2
add rectText.left,ecx
cmp dwWeek,7
jb @b
;³]©w¤å¦rI´ºÃC¦â»P¹ï¸Ü²°I´º¦P¦â
invoke GetSysColor,COLOR_BTNFACE ;¨ú±o¹ï¸Ü²°I´º¦â
mov colorTextBk,eax
invoke SetBkColor,hdc,eax
;¥Ñ½s¿è®Ø¡B½Æ¦X®Ø¤À§O¨ú±o¦è¤¸´X¦~´X¤ë¡A¨Ãpºâ¸Ó¤ëªº¤@¤é¬O¬P´Á´X
invoke GetDlgItemInt,hDialog,IDC_EDIT,NULL,FALSE
mov dwYear,eax
invoke SendMessage,hComboBox,CB_GETCURSEL,0,0
mov dwMonth,eax
mov ecx,eax
inc ecx
mov eax,dwYear
call CalculateDate ;pºâ¬P´Á´X¡A¶Ç¦^©óEAX
mov dwWeek,eax ;¬P´Á¤é¡G0¡A¬P´Á¤@¡G1¡A¡K¡K
;pºâ¸Ó¤ë¦³´X¤Ñ¡A¨Ã¦s©ónMaxDay
mov ecx,dwMonth
movzx edx,nDayOfMonth[ecx]
mov nMaxDay,edx
.IF ecx==1 ;Àˬd¤G¤ë¥÷ªº¤Ñ¼Æ
mov eax,dwYear ;Y¬°¶|¦~«h¤G¤ë¦³29¤Ñ¡AnMaxDay=29
and eax,011b ;§_«h¬°¥¦~¡A¤G¤ë¦³28¤Ñ¡AnMaxDay=28
jnz ok
xor edx,edx
mov ecx,100
mov eax,dwYear
div ecx
.IF edx==0
mov eax,dwYear
mov ecx,400
div ecx
or edx,edx
jz leap_year
.ELSE
leap_year: inc nMaxDay
.ENDIF
.ENDIF
;µe¥X¤ë¾äªí®æ
ok: mov dwDay,1 ;¨CÓ¤ë¥Ñ¤@¤é¶}©l¨ìnMaxDay¤î
mov ecx,ptCalendarTbl.y
mov rectText.top,ecx
next_week: mov eax,dwFontHigh ;¨C¤@¦C(¥Ñ¥ª¦Ó¥k)¥Nªí¤@Ó¬P´Á
shl eax,1 ;¨C¦C¤§¶¡¬Û¹j¥bÓ¦r¤¸°ª¡A¦A¥[¤W¨C¦C¤@Ó¦r¤¸°ª
add eax,dwFontHigh ;¡A¬G¨C¦C¤å¦r¯x§Î¥ª¤W¨¤n¥[¤W¤@Ó¥b¦r¤¸°ª¡A¤~
shr eax,1 ;¬O¤U¤@¦C¤å¦r¯x§Î¥ª¤W¨¤ªº¦ì¸m©Ò¦b
add eax,ecx
mov rectText.top,eax
add eax,dwFontHigh
mov rectText.bottom,eax
next_day: mov eax,dwDay
cmp eax,nMaxDay
ja finish
invoke wsprintf,OFFSET szBuffer,OFFSET szFmt1,eax
invoke CalcTextRect,hdc,dwWeek
mov ecx,dwDay
.IF cx==stLocTime.wDay ;Y¬°¤µ¤é¡A«h¥Hºñ¦âI´ºªí¥Ü
mov eax,TODAYBKCOLOR
.ELSE
mov eax,colorTextBk
.ENDIF
invoke SetBkColor,hdc,eax
invoke DrawText,hdc,OFFSET szBuffer,-1,ADDR rectText,DT_CENTER or DT_VCENTER or DT_SINGLELINE
inc dwDay
inc dwWeek
cmp dwWeek,7
jb next_day
mov dwWeek,0
mov ecx,rectText.top
jmp next_week
finish: ret
DrawCalendarTbl ENDP
;-------------------------------------------------------------------------------
;¨Ì¾ÚdwFontWidth¡BdwFontHighpºâ¦U±±¨î¶µªº¤j¤p¡A¨Ã§â¦U±±¨î¶µ²¾°Ê¨ì¹ï¸Ü²°¾A·íªº¦ì¸m
;¶Ç¦^È¡GEDX¬°¤u§@°Ï¼e«×¡AEAX¬°¤u§@°Ï°ª«×
CalcCtlPosi PROC
LOCAL dwHalfFntWidth:DWORD,ptCtl:POINT
LOCAL dwBtnWidth:DWORD,dwBtnHigh:DWORD
LOCAL dwClientWidth:DWORD,dwClientHigh:DWORD ;¤u§@°Ïªº¼e«×»P°ª«×
;¨Ì¾ÚdwFontWidth¡BdwFontHighpºâ«ö¶sªº¼e«×»P°ª«×¡A¼e¤KÓ¦r¤¸¡A°ª7/4¦r¤¸
mov edx,dwFontWidth
shl edx,3
mov dwBtnWidth,edx
mov ecx,dwFontHigh
shl ecx,3
sub ecx,dwFontHigh
shr ecx,2
mov dwBtnHigh,ecx
;¨Ì¾ÚdwFontWidth¡BdwFontHigh¨M©w¨CÓ±±¨î¶µ¦ì¸m¡A¤è¦¡¦p¤U¡G
;¡@¡@1.¡y¦è¤¸¡z¦b¤u§@°Ï¥ª¤W¨¤¥k¤è¤TÓ¦r¤¸¡B¤U¤è¨âÓ¦r¤¸³B¡A¼e¨âÓ¦r¤¸¡A°ª¤@Ó¦r¤¸
;¡@¡@2.½s¿è®Ø¦b¡y¦è¤¸¡z¥k¤è¥bÓ¦r¤¸³B¡A¼e¥|Ó¦r¤¸¡A°ª¤@Ó¦r¤¸¦A¥[¤»ÂI
;¡@¡@3.¡y¦~¡z¦b½s¿è®Ø¥k¤è¥bÓ¦r¤¸³B¡A¼e¤@Ó¦r¤¸¡A°ª¤@Ó¦r¤¸
;¡@¡@4.½Æ¦X®Ø¦b¡y¦~¡z¥k¤è¥bÓ¦r¤¸³B¡A¼e¥|Ó¦r¤¸¡A°ª
;¡@¡@5.¡y¤ë¡z¦b½Æ¦X®Ø¥bÓ¦r¤¸³B¡A
;¡@¡@6¡y¬d¸ß¡z¡B¡yÂ÷¶}¡z«ö¶s¦b¡y¦è¤¸¡z¤U¤è¤@Ó¦r¤¸³B
;ªð¦^®É¡AEAX¶Ç¦^·sªºµøµ¡¤j¤p¡A§C¦r²Õ¬°µøµ¡¼e«×¡A°ª¦r²Õ¬°µøµ¡°ª«×
mov ecx,dwFontHigh
mov eax,dwFontWidth
shl ecx,1
mov dwHalfFntWidth,eax
mov ptCtl.y,ecx
shr dwHalfFntWidth,1
mov ptCtl.x,eax
shl eax,1
add ptCtl.x,eax
invoke MoveWindow,hStatic0,ptCtl.x,ptCtl.y,ecx,dwFontHigh,TRUE
mov eax,dwFontWidth
shl eax,1
mov ecx,eax
add eax,dwHalfFntWidth
shl ecx,1
add ptCtl.x,eax
mov edx,ptCtl.y
mov eax,dwFontHigh
push ecx
sub edx,3
add eax,6
invoke MoveWindow,hEdit,ptCtl.x,edx,ecx,eax,TRUE
pop ecx
mov eax,dwHalfFntWidth
add ptCtl.x,ecx
add ptCtl.x,eax
invoke MoveWindow,hStatic1,ptCtl.x,ptCtl.y,dwFontWidth,dwFontWidth,TRUE
mov ecx,dwFontWidth
mov eax,dwHalfFntWidth
add ptCtl.x,ecx
add ptCtl.x,eax
shl ecx,2
mov edx,ptCtl.y
mov eax,dwFontHigh
sub edx,3
add eax,6
invoke MoveWindow,hComboBox,ptCtl.x,edx,ecx,eax,TRUE
mov edx,dwHalfFntWidth
mov ecx,dwFontWidth
add ptCtl.x,edx
shl ecx,2
add ptCtl.x,ecx
invoke MoveWindow,hStatic2,ptCtl.x,ptCtl.y,dwFontWidth,dwFontWidth,TRUE
mov eax,ptCtl.x
mov edx,dwFontWidth
shl edx,2
add eax,edx ;EAX=¤u§@°Ï¼e«×=¦è¤¸¨ì¤ëªº¼e«×¦A¥[¤W¥ª¥k¦U¤T¦r¤¸¼e
mov ecx,dwFontHigh
mov dwClientWidth,eax
shl ecx,1
add ptCtl.y,ecx
mov edx,dwBtnWidth
mov ecx,3
shl edx,1 ;¨âÓ«ö¶s
sub eax,edx
cwd
div cx
mov ptCtl.x,eax
push eax ;EAX=¨â«ö¶s¤§¶¡¹j=¡y¬d¸ß¡zÂ÷¥ªÃ䮨¤§¶¡¹j
invoke MoveWindow,hBtn0,eax,ptCtl.y,dwBtnWidth,dwBtnHigh,TRUE
mov edx,dwBtnWidth
pop eax
add ptCtl.x,edx
add eax,ptCtl.x
invoke MoveWindow,hBtn1,eax,ptCtl.y,dwBtnWidth,dwBtnHigh,TRUE
;pºâªí®æ¦ì¸m¡A¨Ã¦s©óptCalendarTblµ²ºcÅéùØ¡C¦¹ªí®æ¬O¥Î¨ÓÅã¥Ü¬YӤ몺¤ë¾ä¡A
;¨C¤@¦æ¼e¤@Ó¥b¦r¤¸¡A¥t¥~¦æ»P¦æ¤§¶¡¬Û¹j¤@Ó¦r¤¸¡A¨C¦C¤§¶¡¬Û¹j¥bÓ¦r¤¸¡C
mov ecx,dwFontHigh
mov eax,dwBtnHigh
shl ecx,1
add ptCtl.y,eax
add ecx,ptCtl.y
mov dwClientHigh,ecx
mov ptCalendarTbl.y,ecx ;¶Ç¦^¤ë¾äªí®æªºY¦ì¸m¡A¦b«ö¶s©³½t¤U¨âÓ¦r¤¸°ª
mov edx,dwFontWidth
mov eax,edx
mov ecx,edx
shl edx,3
shl eax,2
add edx,ecx
add edx,eax
shr ecx,1
add edx,ecx ;EDX=13Ó¥b¦r¤¸¼e
mov eax,dwClientWidth
sub eax,edx
shr eax,1
mov ptCalendarTbl.x,eax ;¶Ç¦^¤ë¾äªí®æªºX¦ì¸m
mov ecx,dwFontHigh
mov eax,ecx
shr eax,1
add eax,ecx
mov ecx,eax
shl eax,2
shl ecx,1
add eax,ecx ;EAX=1.5Ó¦r¤¸°ª¼¥H6
add eax,dwFontHigh ;EAX=³Ì«á¤@¦C©³½t
add eax,dwFontHigh
add eax,dwFontHigh
add dwClientHigh,eax
mov eax,dwClientHigh
mov edx,dwClientWidth
ret
CalcCtlPosi ENDP
;-------------------------------------------------------------------------------
CalcFont PROC hdc:HDC,hWin:HWND
LOCAL dwTemp:DWORD
LOCAL dwWinWidth:DWORD,dwWinHigh:DWORD ;µøµ¡ªº¼e«×»P°ª«×
invoke DeleteObject,hNewFont ;§R°£Âªº¦r§Î
;¨Ì¾ÚdwDlgFontSize¤j¤p¡A«Ø¥ßÅÞ¿è¦rÅé¡A¨ä°ª«×¬°
;int(fabs(FontSize*GetDeviceCaps(hdc,LOGPIXELSY)/72)/10.0+0.5)
;¨Ã§â¦rÅé°ª«×¤Î¼e«×¤À§O¦s©ódwFontHigh¡BdwFontWidthÅܼÆùØ
invoke GetDeviceCaps,hdc,LOGPIXELSY ;¨ú±oªuY¶b¤è¦Vªº¨CÅÞ¿è^¦TªºÂI¼Æ
mov dwTemp,eax ;--st0--
fild dwTemp ;T=¨CÅÞ¿è^¦TªºÂI¼Æ
fimul dwDlgFontSize ;TF
fimul wTen ;10TF
fidiv w72 ;10TF/72
fidiv wTen ;TF/72
fadd dwHalf ;TF/72+0.5
fabs ;|TF/72+0.5|
fistp dwFontHigh
invoke CreateFont,dwFontHigh,0,0,0,500,0,0,0,0,0,0,0,0,OFFSET szFontFace
mov hNewFont,eax
invoke SelectObject,hdc,eax
invoke DeleteObject,eax
invoke GetTextMetrics,hdc,OFFSET tm
mov eax,tm.tmMaxCharWidth
mov dwFontWidth,eax
;¥ÎCalcCtlPosipºâ¦U±±¨î¶µ¦ì¸m¤Î§ïÅܤj¤p¡A¨Ã²¾°Ê¦U±±¨î¶µ¨ì¹ï¸Ü²°ùتº¾A·í¦ì¸m
call CalcCtlPosi
;×§ï¹ï¸Ü²°¤j¤p¡A¨Ã§â¹ï¸Ü²°²¾¨ì¿Ã¹õ¤¤¥¡
mov dwWinWidth,edx ;EDX¬°¹ï¸Ü²°ªº¤u§@°Ï¼e«×
mov dwWinHigh,eax ;EAX¬°¹ï¸Ü²°ªº¤u§@°Ï°ª«×¡A¥H¹Ï¯À¬°³æ¦ì
invoke GetSystemMetrics,SM_CYMENU
add dwWinHigh,eax
invoke GetSystemMetrics,SM_CYCAPTION
add dwWinHigh,eax
invoke GetSystemMetrics,SM_CYFIXEDFRAME
shl eax,1 ;¹ï¸Ü²°°ª«×¡×¤u§@°Ï°ª«×¡Ï¥D¿ï³æ°ª«×¡Ï
add dwWinHigh,eax ;¡@¡@¡@¡@¡@¡@¼ÐÃDÄæ°ª«×¡Ï2¡Ñ¥~®Ø°ª«×
invoke GetSystemMetrics,SM_CXFIXEDFRAME
shl eax,1
add dwWinWidth,eax ;¹ï¸Ü²°¼e«×¡×¤u§@°Ï¼e«×¡Ï2¡Ñ¥~®Ø¼e«×
mov edx,dwScrWidth
sub edx,dwWinWidth
mov ecx,dwScrHigh
sub ecx,dwWinHigh
shr edx,1 ;EDX¡×¹ï¸Ü²°X®y¼Ð¡×(¿Ã¹õ¼e«×¡Ð¹ï¸Ü²°¼e«×)/2
shr ecx,1 ;ECX¡×¹ï¸Ü²°Y®y¼Ð¡×(¿Ã¹õ°ª«×¡Ð¹ï¸Ü²°°ª«×)/2
invoke MoveWindow,hWin,edx,ecx,dwWinWidth,dwWinHigh,TRUE
;§Q¥Î§â¤w«Ø¥ß¦nªº¦r§Î¿ï¤J¦U±±¨î¶µùØ
invoke SendMessage,hStatic0,WM_SETFONT,hNewFont,TRUE
invoke SendMessage,hEdit,WM_SETFONT,hNewFont,TRUE
invoke SendMessage,hStatic1,WM_SETFONT,hNewFont,TRUE
invoke SendMessage,hComboBox,WM_SETFONT,hNewFont,TRUE
invoke SendMessage,hStatic2,WM_SETFONT,hNewFont,TRUE
invoke SendMessage,hBtn0,WM_SETFONT,hNewFont,TRUE
invoke SendMessage,hBtn1,WM_SETFONT,hNewFont,TRUE
ret
CalcFont ENDP
;-------------------------------------------------------------------------------
DlgProc PROC hDlg:HANDLE,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
LOCAL dwTemp:DWORD
.IF uMsg==WM_PAINT
invoke BeginPaint,hDlg,OFFSET ps
invoke DrawCalendarTbl,ps.hdc
invoke EndPaint,hDlg,OFFSET ps
.ELSEIF uMsg==WM_COMMAND
mov eax,wParam
.IF lParam==0
;YlParam=0¡Aªí¥Ü¿ï©w¬Y¿ï³æ¿ï¶µ
.IF ax==IDM_EXIT
invoke EndDialog,hDlg,NULL
.ELSEIF ax==IDM_HELP
invoke wsprintf,OFFSET szBuffer,OFFSET szFmt2,dwDlgFontSize
invoke MessageBox,hDlg,OFFSET szBuffer,OFFSET szTitle,MB_OK or MB_ICONQUESTION
.ELSEIF ax==IDM_CLEAR
invoke SetDlgItemText,hDlg,IDC_EDIT,NULL
.ELSEIF ax==IDM_LARGE
inc dwDlgFontSize
.IF dwDlgFontSize>24
mov dwDlgFontSize,24
jmp no_change
.ENDIF
jmp @f
.ELSEIF ax==IDM_SMALL
dec dwDlgFontSize
.IF dwDlgFontSize<8
mov dwDlgFontSize,8
jmp no_change
.ENDIF
@@: invoke GetDC,hDlg
mov dwTemp,eax
invoke CalcFont,eax,hDlg
invoke ReleaseDC,hDlg,dwTemp
invoke InvalidateRect,hDlg,NULL,TRUE
.ENDIF
.ELSE
;YlParam¤£¬°0¡Aªí¥Ü¿ï©w¬Y¤l±±¨î¤¸¥ó
mov edx,wParam
shr edx,16
.IF dx==BN_CLICKED
.IF ax==IDC_BUTTON1 ;ªí¥Ü«ö¤U¡yÂ÷¶}¡z«ö¶s
invoke SendMessage,hDlg,WM_COMMAND,IDM_EXIT,0
.ELSEIF ax==IDC_BUTTON0 ;ªí¥Ü«ö¤U¡y¬d¸ß¡z«ö¶s
jmp look_up
.ENDIF
.ELSEIF dx==CBN_SELCHANGE ;ªí¥Ü¨Ï¥ÎªÌ¤w¿ï©w¤ë¥÷¤F
.IF ax==IDC_COMBOBOX
look_up: invoke InvalidateRect,hDlg,NULL,TRUE
.ENDIF
.ENDIF
.ENDIF
no_change:
.ELSEIF uMsg==WM_INITDIALOG
invoke LoadIcon,hInstance,OFFSET szIcon
invoke SendMessage,hDlg,WM_SETICON,ICON_BIG,eax
mov eax,hDlg
mov hDialog,eax
;¨ú±o¿Ã¹õªº¼e«×¤Î°ª«×¡A¤À§O¦s©ódwScrWidth¡BdwScrHigh
invoke GetSystemMetrics,SM_CXSCREEN
mov dwScrWidth,eax
invoke GetSystemMetrics,SM_CYSCREEN
mov dwScrHigh,eax
;¨ú±oÀRºA±±¨î¶µ¡B½s¿è®Ø¡B½Æ¦X®Ø¤Î¨âÓ«ö¶sªº¥N½X
invoke GetDlgItem,hDlg,IDC_EDIT
mov hEdit,eax
invoke SetFocus,eax ;§â¿é¤JµJÂI³]¦b½s¿è®Ø
invoke GetDlgItem,hDlg,IDC_COMBOBOX
mov hComboBox,eax
invoke GetDlgItem,hDlg,IDC_BUTTON0
mov hBtn0,eax
invoke GetDlgItem,hDlg,IDC_BUTTON1
mov hBtn1,eax
invoke GetDlgItem,hDlg,IDC_STATIC0
mov hStatic0,eax
invoke GetDlgItem,hDlg,IDC_STATIC1
mov hStatic1,eax
invoke GetDlgItem,hDlg,IDC_STATIC2
mov hStatic2,eax
;©³¤Uªºµ{¦¡¤ù¬q¬O¥Î¨Ó§â¡y¤@¡z¡B¡y¤G¡z¡K¥[¤J½Æ¦X®ØùØ
mov dwTemp,0
@@: mov ecx,dwTemp
mov edx,ecx
shl ecx,1
add ecx,edx
.IF dl==11
add ecx,2
.ENDIF
add ecx,OFFSET szMonth
invoke SendMessage,hComboBox,CB_ADDSTRING,NULL,ecx
inc dwTemp
cmp dwTemp,12
jb @b
;¨Ï·í«eªº¦è¤¸¦~¡B¤ëÅܦ¨½Æ¦X®Øªº¤º©w¿ï¶µ
invoke GetLocalTime,OFFSET stLocTime
movzx ecx,stLocTime.wMonth
dec ecx
invoke SendMessage,hComboBox,CB_SETCURSEL,ecx,0
movzx ecx,stLocTime.wYear
invoke wsprintf,OFFSET szBuffer,OFFSET szFmt0,ecx
invoke SetWindowText,hEdit,OFFSET szBuffer
;¥Î°Æµ{¦¡¡ACalcFont¡Apºâ¦rÅé¤j¤p¡F¨Ã¥Î°Æµ{¦¡¡ASetCtlPosition¡A³]¸m±±¨î¶µ¦ì¸m
invoke GetDC,hDlg
mov dwTemp,eax
invoke CalcFont,eax,hDlg
invoke ReleaseDC,hDlg,dwTemp
.ELSEIF uMsg==WM_CLOSE
invoke SendMessage,hDlg,WM_COMMAND,IDM_EXIT,0
.ELSE
mov eax,FALSE
ret
.ENDIF
mov eax,TRUE
ret
DlgProc ENDP
;-------------------------------------------------------------------------------
start: invoke GetModuleHandle,NULL
mov hInstance,eax
invoke DialogBoxParam,hInstance,offset szDlgName,NULL,offset DlgProc,NULL
invoke ExitProcess,eax
;*******************************************************************************
end start
©³¤U¬O perpetual_calendar.rc ì©l½X¡G
#include "c:\masm32\include\resource.h"
#define IDC_EDIT 100 //¦è¤¸¦~¥÷½s¿è®Ø
#define IDC_COMBOBOX 101 //¤ë¥÷½Æ¦X®Ø
#define IDC_STATIC0 102
#define IDC_STATIC1 103
#define IDC_STATIC2 104
#define IDC_BUTTON0 105 //¬d¸ß«ö¶s
#define IDC_BUTTON1 106 //Â÷¶}«ö¶s
#define IDM_EXIT 107
#define IDM_LARGE 108
#define IDM_SMALL 109
#define IDM_CLEAR 110
#define IDM_HELP 111
#define DLGFONTSIZE 12
CalendarMenu MENU
BEGIN
MENUITEM "Â÷¶}",IDM_EXIT
MENUITEM "©ñ¤j",IDM_LARGE
MENUITEM "ÁY¤p",IDM_SMALL
MENUITEM "²M°£",IDM_CLEAR
MENUITEM "»¡©ú",IDM_HELP
END
CalendarIcon ICON Moon.ico
CalendarDlg DIALOG MOVEABLE PURE LOADONCALL DISCARDABLE 100,0,200,300
STYLE DS_FIXEDSYS|DS_SETFONT|WS_POPUP|WS_VISIBLE|WS_SYSMENU|
WS_MAXIMIZEBOX|WS_MINIMIZEBOX|WS_CAPTION
CAPTION "¸U¦~¾ä"
FONT DLGFONTSIZE,"²Ó©úÅé"
MENU CalendarMenu
BEGIN
CONTROL "¦è¤¸",IDC_STATIC0, "STATIC", WS_CHILD|SS_LEFT|WS_GROUP|WS_VISIBLE,5,13,33,11
CONTROL "", IDC_EDIT, "EDIT", WS_CHILD|ES_LEFT|WS_BORDER|WS_TABSTOP|WS_VISIBLE|ES_NUMBER,40,10,47,12
CONTROL "¦~", IDC_STATIC1, "STATIC", WS_CHILD|SS_LEFT|WS_GROUP |WS_VISIBLE,90,13,35,11
CONTROL "", IDC_COMBOBOX,"COMBOBOX",WS_CHILD|WS_TABSTOP|WS_VISIBLE|CBS_DROPDOWNLIST|WS_VSCROLL,120,10,48,90
CONTROL "¤ë", IDC_STATIC2, "STATIC", WS_CHILD|SS_LEFT|WS_GROUP |WS_VISIBLE,170,13,25,11
CONTROL "¬d¸ß",IDC_BUTTON0, "BUTTON", WS_CHILD|BS_PUSHBUTTON|WS_TABSTOP,40,28,40,12
CONTROL "Â÷¶}",IDC_BUTTON1, "BUTTON", WS_CHILD|BS_PUSHBUTTON|WS_TABSTOP,120,28,40,12
END
©³¤U¬O perpetual_calendar.mak Àɪº¤º®e¡G
# ²£¥Í perpetual_calendar.EXE
ALL : perpetual_calendar.EXE
# ²Õ;¹¤Î³sµ²¾¹
perpetual_calendar.EXE : perpetual_calendar.ASM perpetual_calendar.RES
# ²Õ;¹·|¦Û°Ê¶Ç perpetual_calendar.OBJ µ¹³sµ²¾¹¡A¬G /link ¤§«á¤£¥Î¦A¥[¤W perpetual_calendar.OBJ
ml /coff perpetual_calendar.ASM /link /SUBSYSTEM:WINDOWS perpetual_calendar.RES
# ¸ê·½½s;¹
perpetual_calendar.RES : perpetual_calendar.RC Moon.ico
rc perpetual_calendar.RC
¹Ï¥ÜÀÉ¡AMoon.ico ¦b³oùؤU¸ü¡C
µù¤@¡G¤p¤ì°¸¨Ï¥Î ViewSonic VA916 19 ^¤o²G´¹¿Ã¹õ¡A¥iµø°Ï°ì¬O 37.6¡Ñ30.1 cm2¡A¤]´N¬O 14.8¡Ñ11.85 ¥¤è^¤o¡A¥H¼e 1280 ¹Ï¯À¡B°ª 1024 ¹Ï¯ÀÅã¥Ü®É¡AªuµÛ¤ô¥¤è¦Vªº¸ÑªR«×¬O¨C^¤o 86.5 ӹϯÀ¡AªuµÛ««ª½¤è¦Vªº¸ÑªR«×¬O 86.4 ӹϯÀ ( 1280¡Ò14.8¡Ü86.5¡A1024¡Ò11.85¡Ü86.4¡A600/86¡Ü6.98 )¡C
µù¤G¡G¦]¬°¦a²y¬O¶ê§Îªº¡A¦b¤Ó¶§ª½®gªº¦a°Ï¥u¦³¤@¤p¶ô°Ï°ì¡A¦b³o¶ô°Ï°ì¬O¥¿¤È 12 ®É¡F¦Ó¦b³o¶ô°Ï°ìªºªF¤è¦¤w¹L¤F¥¿¤È 12 ®É¡F¦Ó¦b³o¶ô°Ï°ìªº¦è¤è¡A«o©|¥¼¨ì¥¿¤È¡C§Ú̧â¦a²y¤À¦¨ 24 ӮɰϡA¨Ã¥H^°êÛ´°ªº®æªL«Âªv¤Ñ¤å¥x·í°µ¼Ð·Ç®É¶¡¡AºÙ¬°®æªL«Âªv¼Ð·Ç®É¶¡ ( Greenwich Mean Time¡AÁY¼g¬°¡yGMT¡z)¡A·í¤Ó¶§¦b®æªL«Âªv¤Ñ¤å¥xªº³Ì°ªÂI®É¡A§Y¬°®æªL«Âªv¼Ð·Ç®É¶¡¥¿¤È 12¡G00¡A¦Ó¤¤µØ¥Á°ê¦b¤ñ®æªL«Âªv¼Ð·Ç®É¶¡§Ö 8 Ó¤p®Éªº¦a°Ï¡A´N¥H GMT¡Ï8 ªí¥Ü¡F®L«Â¦iªº®É¶¡¬O¤ñ®æªL«Âªv¼Ð·Ç®É¶¡®É¶¡ºC 10 ¤p®É¡A¥H GMT¡Ð10 ªí¥Ü¡C
¦ý¬O¦]¬°¦a²y¨Ã«D¥¿²yÅé¡A¨C¤Ñªº¦ÛÂà¬O¦³¨Ç¤£³W«hªº¡A¦Ó¥B¥¿¦b½wºC´î³t¤¤¡A©Ò¥H¡A®æªL«Âªv¼Ð·Ç®É¶¡¤w¸g¤£¦A³Q§@¬°¼Ð·Ç®É¶¡¨Ï¥Î¡A²{¦bªº¼Ð·Ç®É¶¡¡A¬O¥Ñä£ì¤lÄÁ³ø®Éªº¨ó½Õ¥@¬É®É¶¡ ( UTC )¡C©Ò¥H¦b¤¤µØ¥Á°ê¡A¥Î GetSystemTime ©Ò±o¨ìªº¬O¨ó½Õ¥@¬É®É¶¡¬O²M±á¨âÂI¾ã¡F¦Ó¥Î GetLocalTime ¨ú±oªº®É¶¡¬O¬O¤W¤È¤QÂI¾ã¡C