16,471
社区成员
发帖
与我相关
我的任务
分享
// 创建控件
BOOL CNCmbBox::Create(HWND hwnd, UINT uid,RECT rec)
{
HINSTANCE hinst = (HINSTANCE)GetWindowLongPtr(hwnd, GWLP_HINSTANCE);
//创建窗口
mWnd = CreateWindow(
L"combobox", //控件类型
L"", //控件标题
WS_CHILD | WS_VISIBLE | WS_OVERLAPPED| WS_VSCROLL | CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_OWNERDRAWFIXED, //样式
rec.left, //x坐标
rec.top, //y坐标
rec.right - rec.left, //宽度
rec.bottom - rec.top, //高度
hwnd, //父窗口句柄
(HMENU)uid, //控件ID号
hinst, //程序全局句柄
NULL //lParam 传递参数
);
//显示控件
ShowWindow(mWnd, SW_SHOW);
//更新控件
UpdateWindow(mWnd);
//消息传递参数
MCTLPARAMS* pCtlParams = new MCTLPARAMS;
pCtlParams->mUid = uid;
pCtlParams->mPtr = this;
//定义消息处理程序
pCtlParams->mProc = (WNDPROC)SetWindowLongPtr(mWnd, GWLP_WNDPROC, (LONG)NCmbProc);
//保存自定义数据到控件窗口的userdata中
SetWindowLongPtr(mWnd, GWLP_USERDATA, (LONG)pCtlParams);
if (m_mColors.size() == 0) InitalColorArray();
list<NCOLORS*>::iterator ite;
for (ite = m_mColors.begin(); ite != m_mColors.end(); ite++)
{
//add string
ComboBox_AddString(
mWnd,
(LPARAM)((NCOLORS*)(*ite))->m_cColor
);
}
return 0;
}
控件消息处理:
LRESULT APIENTRY CNCmbBox::NCmbProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
MCTLPARAMS* mCtlParams = (MCTLPARAMS*)(GetWindowLong(hwnd, GWLP_USERDATA));
WNDPROC nProc = mCtlParams->mProc;
switch (msg)
{
case WM_DRAWITEM:
{
if (((LPDRAWITEMSTRUCT)lParam)->itemState& ODS_SELECTED) //如果当前项被选中
{
SetBkColor(((LPDRAWITEMSTRUCT)lParam)->hDC, GetSysColor(COLOR_HIGHLIGHT));
SetTextColor(((LPDRAWITEMSTRUCT)lParam)->hDC,
GetSysColor(COLOR_WINDOWTEXT) & 0x00FFFFFF
);
}
else
{
SetBkColor(((LPDRAWITEMSTRUCT)lParam)->hDC, GetSysColor(COLOR_WINDOW));
SetTextColor(((LPDRAWITEMSTRUCT)lParam)->hDC,GetSysColor(COLOR_WINDOWTEXT));
}
mCtlParams->mPtr->DrawItem(
((LPDRAWITEMSTRUCT)lParam)->hDC,
((LPDRAWITEMSTRUCT)lParam)->itemID,
((LPDRAWITEMSTRUCT)lParam)->rcItem
);
break;
}
case WM_COMMAND:
{
if (HIWORD(wParam) == CBN_SELCHANGE)
{
//id = ComboBox_GetCurSel(hwnd);
//_itow_s(id, str, 10);
//MessageBox(hwnd, str, NULL, NULL);
//ComboBox_SetCurSel(hwnd, id);
}
break;
}
case WM_CTLCOLORSTATIC:
{
Sleep(0);
break;
}
case WM_MEASUREITEM:
{
((LPMEASUREITEMSTRUCT)lParam)->itemHeight = 36;
break;
}
default:
{
break;
}
}
return CallWindowProc(nProc,hwnd, msg, wParam, lParam); //传递消息给主窗口
}
// 子类化 ComboBox 中的 edit 过程, CBS_DROPDOWN
HWND m_hCbEdit=0;
WNDPROC CBoldEditProc;
LRESULT CALLBACK CbEditProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
switch(Msg)
{
case WM_KEYDOWN:
if(wParam==VK_RETURN) OutputDebugString("VK_RETURN\r\n");
break;
}
return CallWindowProc(CBoldEditProc, hWnd, Msg, wParam, lParam);
}
HWND CreateCB(HWND parentWnd)
{
HWND hComboBox=0;
hComboBox = CreateWindow("COMBOBOX",
NULL,// CBS_DROPDOWNLIST
WS_CHILD | WS_VSCROLL | WS_TABSTOP | CBS_DROPDOWN ,//|CBS_SORT,
330, 40, 90, 140,
parentWnd, (HMENU)IDC_COMBOBOX,
(HINSTANCE) GetWindowLong(parentWnd, GWL_HINSTANCE),
NULL);
//
ShowWindow(hComboBox,SW_SHOW);
SendMessage(hComboBox,CB_ADDSTRING ,0,(LPARAM)"你好");
SendMessage(hComboBox,CB_ADDSTRING ,0,(LPARAM)"我好");
SendMessage(hComboBox,CB_ADDSTRING ,0,(LPARAM)"他好");
SendMessage(hComboBox,CB_ADDSTRING ,0,(LPARAM)"大家好");
return hComboBox;
}
case WM_CREATE:
{
...
m_hComboBox=CreateCB(hwnd);
CBoldProc = (WNDPROC)SetWindowLong(m_hComboBox, GWL_WNDPROC, (LONG)CBProc);
//子类化 ComboBox 过程
WNDPROC CBoldProc;
LRESULT CALLBACK CBProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
char promp[40];
//
switch(Msg)
{
case WM_CTLCOLOREDIT:
if(m_hCbEdit==0)
{
m_hCbEdit=(HWND) lParam;
CBoldEditProc = (WNDPROC)SetWindowLong(m_hCbEdit, GWL_WNDPROC, (LONG)CbEditProc);
}
break;
case WM_CHAR:// only CBS_DROPDOWNLIST
if(wParam==VK_RETURN)
{
OutputDebugString("VK_RETURN\n");
}
break;
case WM_PAINT://0F
// OutputDebugString("WM_LBUTTONDOWN\n");
break;
case WM_SETCURSOR://20
// OutputDebugString("WM_LBUTTONDOWN\n");
break;
case WM_MOUSEFIRST://200
// OutputDebugString("WM_LBUTTONDOWN\n");
break;
case WM_LBUTTONDOWN:
OutputDebugString("WM_LBUTTONDOWN\n");
break;
case WM_LBUTTONDBLCLK:
// OutputDebugString("WM_LBUTTONDBLCLK\n");
break;
case WM_RBUTTONDOWN:
// OutputDebugString("WM_RBUTTONDOWN\n");
break;
case WM_RBUTTONDBLCLK:
// OutputDebugString("WM_RBUTTONDBLCLK\n");
break;
case WM_NCHITTEST: //84
// OutputDebugString("WM_NCHITTEST\n");
break;
case WM_NOTIFY://4E
{
OutputDebugString("WM_NOTIFY\n");
}
break;
default :
sprintf(promp,"Msg %04X\n",Msg);
//OutputDebugString(promp);
break;
}
return CallWindowProc(CBoldProc, hWnd, Msg, wParam, lParam);
}
SetWindowLongPtr(mWnd, GWLP_WNDPROC, (LONG)NCmbProc);