==== 1. 问题 ==============================
    (1) 在工具条的按钮中, 如何使用自定义的位图 (不想使用HINST_COMMCTRL), 和如何使用自定义字串?或者需要先制作ImageList,如何制作、如何使用?
    (2) 在资源文件中定义的Menu、Accelerators、Icon、String资源可调用出, 但Bitmap调用不出来, 不知何因
    (3) 在文本框(Edit控件)中, 如何具有Password风格, 即字符只显示为 *****
    (4) 在状态条(StatusBar)中, 如何使字串居中




==== 2. 原文件 ==============================
---- (1) 资源文件使用的定义文件 <MyCode.h> --
#define idMenu        0x1000
#define idMenuOpen    0x1001
#define idMenuSave    0x1002
#define idMenuExit    0x1003
#define idAcceKey     0x1010
#define idIcon        0x1020
#define idBmp1        0x1030
#define idBmp2        0x1031
#define idStr1        0x1041
#define idStr2        0x1042


---- (2) 资源文件 <MyCode.RC> ---------------
#include "c:\masm32\INCLUDE\Resource.h"
#include "MyCode.h"


/*----菜单----*/
idMenu    MENU    DISCARDABLE
BEGIN
    POPUP    "&File "
    BEGIN
        MENUITEM    "Open",    idMenuOpen
        MENUITEM    "Save",    idMenuSave
        MENUITEM    "Exit",    idMenuExit
    END
END

/*----加速键----*/
idAcceKey    ACCELERATORS
BEGIN
    VK_F2, idMenuOpen, VIRTKEY
    VK_F3, idMenuSave, VIRTKEY
END

/*----图标----*/
idIcon1 ICON    MOVEABLE PURE LOADONCALL DISCARDABLE    "D:\Prog\Ico\Ico32-16\Filer.Ico"

/*----位图----*/
idBmp1  BITMAP  DISCARDABLE    "D:\Prog\Bmp\File.bmp"
idBmp2  BITMAP  DISCARDABLE    "D:\Prog\Bmp\View.bmp"
161     BITMAP  DISCARDABLE    "D:\Prog\Bmp\open.bmp"
162     BITMAP  DISCARDABLE    "D:\Prog\Bmp\CLock.bmp"

/*----字串----*/
STRINGTABLE DISCARDABLE
BEGIN
    idStr1    "String1\0"
    idStr2    "String2\0"
END


---- (3) 原代码文件 <MyCode.Asm> ------------
.586
;.Model flat, StdCall
Option   CaseMap: none


Include c:\Masm32\include\Kernal32.INC
Include c:\Masm32\include\User32.INC
Include c:\Masm32\include\Comctl32.INC
IncludeLib  c:\masm32\lib\Kernal32.lib
IncludeLib  c:\masm32\lib\User32.lib
IncludeLib  c:\masm32\lib\Comctl32.lib


.Const
ID_Menu        EQU    1000H
ID_MenuOpen    EQU    1001H
ID_MenuSave    EQU    1002H
ID_MenuExit    EQU    1003H
ID_AcceKey     EQU    1010H
ID_Icon        EQU    1020H
ID_Bmp1        EQU    1030H
ID_Bmp2        EQU    1031H
ID_Bmp3        EQU    1032H
ID_Str1        EQU    1041H
ID_Str2        EQU    1042H

ID_TOOLBAR     EQU    1


.Data
mdhInst         DD      0
mdhWnd          DD      0
mdhMenu         DD      0
mdhToolBar      DD      0
mdhStatus       DD      0
mdhStatic       DD      0
mdhEdit         DD      0

mdhMainIco      DD      0
mdhBitmap       DD      0

mszAppName      DB      "App", 0
mszClassName    DB      "App0", 0
mszClassStatic  DB      "STATIC", 0
mszClassEdit    DB      "Edit", 0

;--- Toolbar ------
NUM_BUTTONS     EQU     6
mauToolbar      DB      0
TBBUTTON        <0,            0,       0,               TBSTYLE_SEP,    0,0,-1>
TBBUTTON        <STD_FILEOPEN, ID_Bmp1, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0,0,-1>
TBBUTTON        <STD_FILESAVE, ID_Bmp2, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0,0,-1>
TBBUTTON        <0,            0,       TBSTATE_ENABLED, TBSTYLE_SEP,    0,0,-1>
TBBUTTON        <STD_FIND,     ID_Bmp3, TBSTATE_ENABLED, TBSTYLE_CHECK,  0,0,-1>
TBBUTTON        <0,            0,       TBSTATE_ENABLED, TBSTYLE_SEP,    0,0,-1>

;--- Status -------
SBCount         EQU     4
SBWidth_0       EQU     100
SBWidth_1       EQU     100
SBWidth_2       EQU     100

mdnSbWidth      DD      0
                DD      100
                DD      200
                DD      300
                DD      -1

.Code
start:
    Invoke  FindWindow, Addr mszClassName, NULL
    TEST    EAX, EAX
    JNZ     Exit

    Invoke  GetModuleHandle, NULL
    MOV     mdhInst, EAX

    Invoke  InitCommonControls
    Invoke  WinMain, mdhInst, NULL, NULL, SW_SHOWDEFAULT

Exit:
    Invoke  ExitProcess, EAX


WinMain     PROC tdhInst:DWORD, tdhPrevInst:DWORD, CmdLine:DWORD, CmdShow:DWORD
    Local   luWC:WNDCLASSEX
    Local   luMsg:MSG
    Local   @hAcceKey

    Invoke  RtlZeroMemory, Addr luWC, SizeOf WNDCLASSEX
    Invoke  RtlZeroMemory, Addr luMsg, SizeOf MSG

    ;---- 装入资源 ---------------------------
    Invoke  LoadMenu, tdhInst, ID_Menu
    MOV     mdhMenu, EAX
    Invoke  LoadIcon, tdhInst, ID_Icon
    MOV     mdhMainIco, EAX

    ;---- 注册窗口类 -----------------------------
    MOV     luWC.cbSize, SizeOf WNDCLASSEX
    MOV     luWC.style, CS_BYTEALIGNWINDOW        ;CS_HREDRAW OR CS_VREDRAW OR CS_BYTEALIGNWINDOW    ;NULL
    MOV     luWC.lpfnWndProc, Offset WndProc
    MOV     luWC.cbClsExtra, NULL
    MOV     luWC.cbWndExtra, NULL
    PUSH    tdhInst
    POP     luWC.hInstance
    MOV     luWC.hbrBackground, 10H
    MOV     luWC.lpszMenuName, NULL
    MOV     luWC.lpszClassName, Offset mszClassName
    MOV     EAX, mdhMainIco
    MOV     luWC.hIcon, EAX                ; 标题栏图标
    MOV     luWC.hIconSm, EAX              ; 标题栏图标
    Invoke  LoadCursor, NULL, IDC_ARROW
    MOV     luWC.hCursor, EAX
    Invoke  RegisterClassEx, Addr luWC

    ;---- 建立输出窗口 ---------------------------
    Invoke  GetSystemMetrics, SM_CXSCREEN
    Invoke  CreateWindowEx, WS_EX_ACCEPTFILES, Addr mszClassName, Addr mszAppName, \
            WS_OVERLAPPEDWINDOW OR WS_EX_WINDOWEDGE OR WS_EX_CLIENTEDGE, \    ; +WS_CAPTION+WS_SYSMENU+WS_MINIMIZEBOX+WS_VISIBLE, \
            0, 0, 300, 200, \
            NULL, mdhMenu, tdhInst, NULL
    MOV     mdhWnd, EAX

    ;---- 补充装入资源 --------------------------
    Invoke  LoadAccelerators, tdhInst, ID_AcceKey
    MOV     @hAcceKey, EAX

    Invoke  LoadBitmap, tdhInst, ID_Bmp1
    Invoke  SendMessage, mdhWnd, STM_SETIMAGE, ID_Bmp1, EAX

    ;---- 显示窗口 ---------------------------
    Invoke  ShowWindow, mdhWnd, SW_SHOWNORMAL
    Invoke  UpdateWindow, mdhWnd


    ;---- 消息循环 -------------------------------
    .While  TRUE
        Invoke  GetMessage, Addr luMsg, NULL, 0, 0
        .Break  .If EAX == 0
        Invoke  TranslateAccelerator, mdhWnd, @hAcceKey, Addr luMsg
        .If EAX == 0
            Invoke  TranslateMessage, Addr luMsg
            Invoke  DispatchMessage, Addr luMsg
        .Endif
    .Endw
    MOV    EAX, luMsg.wParam
    RET
WinMain ENDP


WndProc PROC tdhWnd:DWORD, tdnMsg:DWORD, tdnWParam:DWORD, tdnLParam:DWORD
    .If tdnMsg == WM_CREATE
        ;-- Toolbar ----------------------
        Invoke  S_FrmTbInit, tdhWnd

        ;-- ImageList --------------------
    ;   Invoke  ImageList_Create,24,24,

        ;-- Static -----------------------
        Invoke  CreateWindowEx, NULL, Offset mszClassStatic, NULL, \
                WS_CHILD OR WS_VISIBLE OR WS_BORDER OR WS_TABSTOP, \
                20, 60, 100, 30, \
                tdhWnd, 0, mdhInst, NULL
        MOV     mdhStatic, EAX
     
        ;-- Edit -------------------------
        Invoke  CreateWindowEx, NULL, Offset mszClassEdit, NULL, \
                WS_CHILD OR WS_VISIBLE OR WS_BORDER OR WS_TABSTOP, \
                130, 60, 100, 30, \
                tdhWnd, 0, mdhInst, NULL
        MOV     mdhEdit, EAX
    ;   Invoke  SendMessage, mdhEdit, WM_SETFONT, mdhFontSong10, 1

        ;-- Statusbar ----------------------
        Invoke  CreateStatusWindow, WS_CHILD OR WS_VISIBLE OR SBS_SIZEGRIP, 0, tdhWnd, 200
        MOV     mdhStatus, EAX
        Invoke  SendMessage, mdhStatus, SB_SETPARTS, 6, Offset mdnSbWidth
        Invoke  SendMessage, mdhStatus, SB_SETBKCOLOR, 0, 0E0FFFFh
    ;   Invoke  SendMessage, mdhStatus, WM_SETFONT, mdhFontSong10, 1

    .ElseIf tdnMsg == WM_COMMAND

    .ElseIf tdnMsg == WM_NOTIFY

    .Elseif tdnMsg == WM_DROPFILES

    .ElseIf tdnMsg == WM_MOUSEMOVE

    .ElseIf tdnMsg == WM_LBUTTONUP

    .ElseIf tdnMsg == WM_SIZE

    ;.ElseIf tdnMsg == WM_PAINT

    ;.ElseIf uMsg == WM_CLOSE

    .ElseIf tdnMsg == WM_DESTROY
        Invoke  PostQuitMessage, NULL

    .Else
        Invoke  DefWindowProc, tdhWnd, tdnMsg, tdnWParam, tdnLParam
        RET
    .EndIf

    XOR     EAX, EAX
    RET
WndProc ENDP


S_FrmTbInit PROC tdhWnd:DWORD
    Local   tbb:TBBUTTON

    Invoke  CreateToolbarEx, tdhWnd,\
            WS_VISIBLE or WS_CHILD or TBSTYLE_FLAT or TBSTYLE_TOOLTIPS or CCS_ADJUSTABLE,\
            ID_TOOLBAR, \
            5, HINST_COMMCTRL, IDB_STD_LARGE_COLOR,
            Offset mauToolbar + 1, NUM_BUTTONS, \
            24, 24, 24, 24, \
            Sizeof TBBUTTON
    MOV     mdhToolBar, EAX
    Invoke  ShowWindow, mdhToolBar, SW_SHOW

    Invoke  LoadBitmap, mdhInst, ID_Bmp1
    MOV     tbb.iBitmap, EAX
    MOV     tbb.fsStyle, TBSTYLE_BUTTON
    MOV     tbb.idCommand, ID_Bmp3
    Invoke  SendMessage, mdhToolBar, TB_ADDBITMAP, 3, Addr tbb

    XOR     EAX, EAX
    RET
S_FrmTbInit ENDP
    End start