#include <windows.h>
#include <WinUser.h>
#include <CommCtrl.h>
#include "controlid.h"
#include "globallists.h"
#include <cwchar>
#include <vector>
//----------------------------------------------------
//BS_PUSHBUTTON
//----------------------------------------------------
void CreatePushButton(const HWND &ParentHwnd)
{
CreateWindow(
L"Button",
L"文本",
WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,
10,10,90,30,
ParentHwnd,
(HMENU)PUSHBUTTONID,
(HINSTANCE)GetWindowLong(ParentHwnd,GWL_HINSTANCE),
NULL);
}
void HandlePushButtonMessage(const HWND &ParentHwnd, const UINT &Message, const WPARAM &WParam, const LPARAM &LParam)
{
switch(Message)
{
case WM_COMMAND:
switch(LOWORD(WParam))
{
case PUSHBUTTONID:
switch(HIWORD(WParam))
{
case BN_CLICKED:
HRESULT messageboxResult=MessageBox(ParentHwnd,L"消息",L"标题",MB_ICONEXCLAMATION|MB_YESNO);
switch(messageboxResult)
{
case IDYES:
MessageBox(ParentHwnd,L"点击了\"是\"",L"标题",NULL);
break;
case IDNO:
MessageBox(ParentHwnd,L"点击了\"否\"",L"标题",NULL);
break;
}
break;
}
}
break;
}
}
//----------------------------------------------------
//BS_AUTO3STATE
//----------------------------------------------------
void CreateAuto3StateButton(const HWND &ParentHwnd)
{
CreateWindow(
L"Button",
L"文本",
WS_VISIBLE | WS_CHILD | BS_AUTO3STATE,
10,50,90,30,
ParentHwnd,
(HMENU)AUTO3STATEBUTTONID,
(HINSTANCE)GetWindowLong(ParentHwnd,GWL_HINSTANCE),
NULL
);
//默认设置为未选定
SendMessage(GetDlgItem(ParentHwnd,AUTO3STATEBUTTONID),BM_SETCHECK,BST_INDETERMINATE,0);
}
void HandleAuto3StateButtonMessage(const HWND &ParentHwnd, const UINT &Message, const WPARAM &WParam, const LPARAM &LParam)
{
switch (Message)
{
case WM_COMMAND:
switch(LOWORD(WParam))
{
case AUTO3STATEBUTTONID:
switch(HIWORD(WParam))
{
case BN_CLICKED:
UINT state=SendMessage(GetDlgItem(ParentHwnd,AUTO3STATEBUTTONID), BM_GETCHECK ,0,0);
switch(state)
{
case BST_CHECKED:
MessageBox(ParentHwnd,L"选择状态",L"标题",NULL);
break;
case BST_INDETERMINATE:
MessageBox(ParentHwnd,L"未定状态",L"标题",NULL);
break;
case BST_UNCHECKED:
MessageBox(ParentHwnd,L"未选择状态",L"标题",NULL);
break;
}
break;
}
}
break;
}
}
//----------------------------------------------------
//BS_AUTOCHECKBOX
//----------------------------------------------------
void CreateAutoCheckBox(const HWND &ParentHwnd)
{
CreateWindow(
L"Button",
L"文本",
WS_VISIBLE | WS_CHILD | BS_AUTOCHECKBOX,
10,90,90,30,
ParentHwnd,
(HMENU)AUTOCHECKBUTTONID,
(HINSTANCE)GetWindowLong(ParentHwnd,GWL_HINSTANCE),
NULL
);
}
void HandleAutoCheckBoxMessage(const HWND &ParentHwnd, const UINT &Message, const WPARAM &WParam, const LPARAM &LParam)
{
switch(Message)
{
case WM_COMMAND:
switch(LOWORD(WParam))
{
case AUTOCHECKBUTTONID:
switch(HIWORD(WParam))
{
case BN_CLICKED:
UINT state=SendMessage(GetDlgItem(ParentHwnd,AUTOCHECKBUTTONID), BM_GETCHECK ,0,0);
switch(state)
{
case BST_CHECKED:
MessageBox(ParentHwnd,L"选择状态",L"标题",NULL);
break;
case BST_UNCHECKED:
MessageBox(ParentHwnd,L"未选择状态",L"标题",NULL);
break;
}
break;
}
}
break;
}
}
//----------------------------------------------------
//BS_GROUPBOX BS_AUTORADIOBUTTON
//----------------------------------------------------
void CreateRadioButtonGroup(const HWND &ParentHwnd)
{
CreateWindow(
L"Button",
L"文本",
WS_VISIBLE | WS_CHILD | BS_GROUPBOX,
10,130,80,90,
ParentHwnd,
(HMENU)GROUPBOXID,
(HINSTANCE)GetWindowLong(ParentHwnd,GWL_HINSTANCE),
NULL
);
CreateWindow(
L"Button",
L"文本1",
WS_VISIBLE | WS_CHILD | BS_AUTORADIOBUTTON|WS_GROUP,
15,150,60,20,
ParentHwnd,
(HMENU)AUTORADIOBUTTON1ID,
(HINSTANCE)GetWindowLong(ParentHwnd,GWL_HINSTANCE),
NULL
);
CreateWindow(
L"Button",
L"文本2",
WS_VISIBLE | WS_CHILD | BS_AUTORADIOBUTTON,
15,170,60,20,
ParentHwnd,
(HMENU)AUTORADIOBUTTON2ID,
(HINSTANCE)GetWindowLong(ParentHwnd,GWL_HINSTANCE),
NULL
);
CreateWindow(
L"Button",
L"文本3",
WS_VISIBLE | WS_CHILD | BS_AUTORADIOBUTTON,
15,190,60,20,
ParentHwnd,
(HMENU)AUTORADIOBUTTON3ID,
(HINSTANCE)GetWindowLong(ParentHwnd,GWL_HINSTANCE),
NULL
);
//设置第二个为默认选中
SendMessage(GetDlgItem(ParentHwnd,AUTORADIOBUTTON2ID),BM_SETCHECK,BST_CHECKED,0);
}
void HandleRadioButtonGroupMessage(const HWND &ParentHwnd, const UINT &Message, const WPARAM &WParam, const LPARAM &LParam)
{
UINT buttons[3]={AUTORADIOBUTTON1ID,AUTORADIOBUTTON2ID,AUTORADIOBUTTON3ID};
switch(Message)
{
case WM_COMMAND:
switch(LOWORD(WParam))
{
case AUTORADIOBUTTON1ID:
case AUTORADIOBUTTON2ID:
case AUTORADIOBUTTON3ID:
for (INT i=0;i<3;i++)
{
if (BST_CHECKED==SendMessage(GetDlgItem(ParentHwnd,buttons[i]), BM_GETCHECK ,0,0))
{
wchar_t buf[30];
std::swprintf(buf,29,L"单选按钮%d",i+1);
MessageBox(ParentHwnd,buf,L"标题",NULL);
}
}
break;
}
break;
}
}
//----------------------------------------------------
//TRACKBAR_CLASS STATIC
//----------------------------------------------------
void CreateTrackBar(const HWND &ParentHwnd)
{
//范围过大的时候可能出现问题
HWND hwndDlg=ParentHwnd; // handle of dialog box (parent window)
UINT iMin=-100; // minimum value in trackbar range
UINT iMax=20000; // maximum value in trackbar range
HWND hwndTrack = CreateWindow(
TRACKBAR_CLASS, // class name
L"Trackbar Control", // title (caption)
WS_CHILD |
WS_VISIBLE | TBS_TOOLTIPS|
TBS_AUTOTICKS, // style
30, 230, // position
200, 40, // size
hwndDlg, // parent window
(HMENU)TRACKBARID, // control identifier
(HINSTANCE)GetWindowLong(ParentHwnd,GWL_HINSTANCE), // instance
NULL // no WM_CREATE parameter
);
SendMessage(hwndTrack, TBM_SETRANGE,
(WPARAM) TRUE, // redraw flag
(LPARAM) MAKELONG(iMin, iMax)); // min. & max. positions
SendMessage(hwndTrack, TBM_SETPAGESIZE,
0, (LPARAM) 4); // new page size
SendMessage(hwndTrack, TBM_SETSEL,
(WPARAM) FALSE, // redraw flag
(LPARAM) MAKELONG(iMin, iMax));
SendMessage(hwndTrack, TBM_SETPOS,
(WPARAM) TRUE, // redraw flag
(LPARAM) (long)((iMax-iMin)/2));
//创建一个静态文本,显示当前值
CreateWindow(
L"STATIC",
L"文本",
WS_VISIBLE | WS_CHILD | SS_LEFT,
30,280,150,20,
ParentHwnd,
(HMENU)TRACKBARSTATICID,
(HINSTANCE)GetWindowLong(ParentHwnd,GWL_HINSTANCE),
NULL
);
int pos=SendMessage(hwndTrack, TBM_GETPOS,0,0);
wchar_t buf[30];
std::swprintf(buf,29,L"当前值为:%d",pos);
SetWindowText(GetDlgItem(ParentHwnd,TRACKBARSTATICID),buf);
SetFocus(hwndTrack);
}
void HandleTrackBarMessage(const HWND &ParentHwnd, const UINT &Message, const WPARAM &WParam, const LPARAM &LParam)
{
switch(Message)
{
//本滑动条是横向的
case WM_HSCROLL:
//拖拽的同时,同步更新变量,更新频率会很高
if ((HWND)LParam==GetDlgItem(ParentHwnd,TRACKBARID))
{
int pos=SendMessage((HWND)LParam, TBM_GETPOS,0,0);
wchar_t buf[30];
std::swprintf(buf,29,L"当前值为:%d",pos);
SetWindowText(GetDlgItem(ParentHwnd,TRACKBARSTATICID),buf);
SetFocus((HWND)LParam);
}
}
}
//----------------------------------------------------
//WC_COMBOBOXEX
//----------------------------------------------------
void CreateComboBox(const HWND &ParentHwnd)
{
// Create the Combobox
//
// Uses the CreateWindow function to create a child window of
// the application window. The WC_COMBOBOX window style specifies
// that it is a combobox.
int xpos = 10; // Horizontal position of the window.
int ypos = 320; // Vertical position of the window.
int nwidth = 200; // Width of the window
int nheight = 20; // Height of the window
HWND hwndParent = ParentHwnd; // Handle to the parent window
HWND hWndComboBox = CreateWindow(WC_COMBOBOX, TEXT(""),
CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_CHILD | WS_OVERLAPPED | WS_VISIBLE,
xpos, ypos,
nwidth, nheight,
hwndParent,
(HMENU)COMBOBOXID,
(HINSTANCE)GetWindowLong(ParentHwnd, GWL_HINSTANCE),
NULL);
// load the combobox with item list.
// Send a CB_ADDSTRING message to load each item
TCHAR Planets[9][10] =
{
TEXT("Mercury"), TEXT("Venus"), TEXT("Terra"), TEXT("Mars"),
TEXT("Jupiter"), TEXT("Saturn"), TEXT("Uranus"), TEXT("Neptune"),
TEXT("Pluto??")
};
TCHAR A[16];
int k = 0;
memset(&A, 0, sizeof(A));
for (k = 0; k <= 8; k += 1)
{
wcscpy_s(A, sizeof(A) / sizeof(TCHAR), (TCHAR*)Planets[k]);
// Add string to combobox.
SendMessage(hWndComboBox, (UINT)CB_ADDSTRING, (WPARAM)0, (LPARAM)A);
}
// Send the CB_SETCURSEL message to display an initial item
// in the selection field
SendMessage(hWndComboBox, CB_SETCURSEL, (WPARAM)3, (LPARAM)0);
}
void HandleComboBoxMessage(const HWND &ParentHwnd, const UINT &Message, const WPARAM &WParam, const LPARAM &LParam)
{
switch (Message)
{
case WM_COMMAND:
//注意!当使用 SendMessage(hWndComboBox, CB_SETCURSEL, (WPARAM)3, (LPARAM)0);
//改变当前选定值时,不会产生CBN_SELCHANGE消息。
if (HIWORD(WParam)== CBN_SELCHANGE && LOWORD(WParam)== COMBOBOXID)
{
// If the user makes a selection from the list:
// Send CB_GETCURSEL message to get the index of the selected list item.
// Send CB_GETLBTEXT message to get the item.
// Display the item in a messagebox.
int ItemIndex = SendMessage((HWND)LParam, (UINT)CB_GETCURSEL,(WPARAM)0, (LPARAM)0);
TCHAR ListItem[256];
(TCHAR)SendMessage((HWND)LParam, (UINT)CB_GETLBTEXT,(WPARAM)ItemIndex, (LPARAM)ListItem);
MessageBox(ParentHwnd, (LPCWSTR)ListItem, TEXT("Item Selected"), MB_OK);
}
default:
break;
}
}
//----------------------------------------------------
//WC_LISTBOX
//----------------------------------------------------
void CreateListBoxSingle(const HWND &ParentHwnd)
{
//创建
HWND hwndTrack = CreateWindow(
WC_LISTBOX, // class name
L"List Box", // title (caption)
WS_CHILD |
WS_VISIBLE | LBS_STANDARD | LBS_NOTIFY, // style
10, 350, // position
200, 100, // size
ParentHwnd, // parent window
(HMENU)LISTBOXID, // control identifier
(HINSTANCE)GetWindowLong(ParentHwnd, GWL_HINSTANCE), // instance
NULL // no WM_CREATE parameter
);
//初始化信息
typedef struct
{
TCHAR achName[MAX_PATH];
TCHAR achPosition[12];
int nGamesPlayed;
int nGoalsScored;
} Player;
Player Roster[] =
{
{ TEXT("Haas, Jonathan"), TEXT("Midfield"), 18, 4 },
{ TEXT("Pai, Jyothi"), TEXT("Forward"), 36, 12 },
{ TEXT("Hanif, Kerim"), TEXT("Back"), 26, 0 },
{ TEXT("Anderberg, Michael"), TEXT("Back"), 24, 2 },
{ TEXT("Jelitto, Jacek"), TEXT("Midfield"), 26, 3 },
{ TEXT("Raposo, Rui"), TEXT("Back"), 24, 3 },
{ TEXT("Joseph, Brad"), TEXT("Forward"), 13, 3 },
{ TEXT("Bouchard, Thomas"), TEXT("Forward"), 28, 5 },
{ TEXT("Salmre, Ivo "), TEXT("Midfield"), 27, 7 },
{ TEXT("Camp, David"), TEXT("Midfield"), 22, 3 },
{ TEXT("Kohl, Franz"), TEXT("Goalkeeper"), 17, 0 },
};
// Add items to list.
HWND hwndList = GetDlgItem(ParentHwnd, LISTBOXID);
for (int i = 0; i < ARRAYSIZE(Roster); i++)
{
int pos = (int)SendMessage(hwndList, LB_ADDSTRING, 0,
(LPARAM)Roster[i].achName);
// Set the array index of the player as item data.
// This enables us to retrieve the item from the array
// even after the items are sorted by the list box.
SendMessage(hwndList, LB_SETITEMDATA, pos, (LPARAM)i);
}
SendMessage(hwndList, LB_SETCURSEL, 2, 0);
}
void HandleListBoxSingleMessage(const HWND &ParentHwnd, const UINT &Message, const WPARAM &WParam, const LPARAM &LParam)
{
switch (Message)
{
case WM_COMMAND:
if (HIWORD(WParam) == LBN_SELCHANGE && LOWORD(WParam) == LISTBOXID)
{
int ItemIndex = SendMessage((HWND)LParam, (UINT)LB_GETSEL, (WPARAM)0, (LPARAM)0);
TCHAR ListItem[256];
(TCHAR)SendMessage((HWND)LParam, (UINT)LB_GETTEXT, (WPARAM)ItemIndex, (LPARAM)ListItem);
MessageBox(ParentHwnd, (LPCWSTR)ListItem, TEXT("Item Selected"), MB_OK);
}
default:
break;
}
}
//----------------------------------------------------
//Edit
//----------------------------------------------------
void CreateEdit(const HWND &ParentHwnd)
{
//创建
HWND hwndedit = CreateWindow(
L"EDIT", // class name
L"edit", // title (caption)
WS_CHILD | WS_VISIBLE | WS_VSCROLL |
ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL, // style
10, 460, // position
200,150, // size
ParentHwnd, // parent window
(HMENU)EDITID, // control identifier
(HINSTANCE)GetWindowLong(ParentHwnd, GWL_HINSTANCE), // instance
NULL // no WM_CREATE parameter
);
}
void HandleEditMessage(const HWND &ParentHwnd, const UINT &Message, const WPARAM &WParam, const LPARAM &LParam)
{
switch (Message)
{
case WM_COMMAND:
if (HIWORD(WParam) == EN_CHANGE && LOWORD(WParam) == EDITID)
{
int length =GetWindowTextLength((HWND)LParam);
std::wstring buf;
buf.resize(length);
GetWindowText((HWND)LParam,(LPWSTR)buf.c_str(),length);
MessageBox(ParentHwnd, buf.c_str(), TEXT("Item Selected"), MB_OK);
}
default:
break;
}
}