以下是“方餐”对话框的对话框步骤和支持功能。
HWND hwndMain;
HWND hwndEdit;
char achTemp[256]; /* temporary buffer */
HBITMAP hbmBread;
HBITMAP hbmDairy;
HBITMAP hbmFruit;
HBITMAP hbmMeat;
HBITMAP hbmBreadMask;
HBITMAP hbmDairyMask;
HBITMAP hbmFruitMask;
HBITMAP hbmMeatMask;
/********************************************************
功能:FoodDlgProc
目的:食物对话框对话框。
*********************************************************/
BOOL CALLBACK FoodDlgProc(hwndDlg, msg, wParam, lParam)
HWND hwndDlg;
UINT msg;
WPARAM wParam;
LPARAM lParam;
{
LPMEASUREITEMSTRUCT lpmis;
LPDRAWITEMSTRUCT lpdis;
HBITMAP hbmIcon;
HBITMAP hbmMask;
COLORREF clrBackground;
COLORREF clrForeground;
TEXTMETRIC tm;
HDC hdc;
HWND hwnd;
int x;
int y;
switch(msg){
case WM_INITDIALOG:
/*
*调用应用程序定义的函数加载
*位图资源。
*/
if(!LoadIconBitmaps()){
EndDialog(hwndDlg, -1);
break;
}
/ *初始化下拉列表框。*/
if(!InitGroupList(hwndDlg)){
DeleteIconBitmaps();
EndDialog(hwndDlg, -1);
break;
}
/ *选择第一个食物组。*/
SendDlgItemMessage(hwndDlg,IDCOMBO,CB_SETCURSEL,
0, 0);
/ *列出食物并选择第一份食物。*/
InitFoodList(hwndDlg);
SendDlgItemMessage(hwndDlg,IDLIST,LB_SETCURSEL,
0, 0);
break;
case WM_MEASUREITEM:
lpmis = (LPMEASUREITEMSTRUCT) lParam;
if(lpmis- > itemHeight < CY_BITMAP + 2)
lpmis->itemHeight = CY_BITMAP + 2;
break;
case WM_DRAWITEM:
lpdis = (LPDRAWITEMSTRUCT) lParam;
if (lpdis->itemID == -1) /* empty item */
break;
/ *确定用于绘制图标的位图。*/
switch(lpdis- > itemData){
case ID_BREAD:
hbmIcon = hbmBread;
hbmMask = hbmBreadMask;
break;
case ID_DAIRY:
hbmIcon = hbmDairy;
hbmMask = hbmDairyMask;
break;
case ID_FRUIT:
hbmIcon = hbmFruit;
hbmMask = hbmFruitMask;
break;
默认值:/ *肉* /
hbmIcon = hbmMeat;
hbmMask = hbmMeatMask;
break;
}
/*
*颜色取决于物品是否
*选择。
*/
clrForeground = SetTextColor(lpdis->hDC,
GetSysColor(lpdis- > itemState & ODS_SELECTED?
COLOR_HIGHLIGHTTEXT : COLOR_WINDOWTEXT));
clrBackground = SetBkColor(lpdis->hDC,
GetSysColor(lpdis- > itemState & ODS_SELECTED?
COLOR_HIGHLIGHT : COLOR_WINDOW));
/ *计算垂直和水平位置。*/
GetTextMetrics(lpdis->hDC, &tm);
y = (lpdis->rcItem.bottom + lpdis->rcItem.top -
tm.tmHeight) / 2;
x = LOWORD(GetDialogBaseUnits()) / 4;
/ *获取并显示列表项的文本。*/
SendMessage(lpdis- > hwndItem,CB_GETLBTEXT,
lpdis->itemID, (LPARAM) (LPCSTR) achTemp);
ExtTextOut(lpdis- > hDC,CX_BITMAP + 2 * x,y,
ETO_CLIPPED | ETO_OPAQUE,{lpdis-}
achTemp, lstrlen(achTemp), NULL);
/ *恢复以前的颜色。*/
SetTextColor(lpdis->hDC, clrForeground);
SetBkColor(lpdis->hDC, clrBackground);
/ *显示图标。*/
hdc = CreateCompatibleDC(lpdis->hDC);
if (hdc == NULL)
break;
SelectObject(hdc, hbmMask);
BitBlt(lpdis- > hDC,x,lpdis- > rcItem.top + 1,
CX_BITMAP, CY_BITMAP, hdc, 0, 0, SRCAND);
SelectObject(hdc, hbmIcon);
BitBlt(lpdis- > hDC,x,lpdis- > rcItem.top + 1,
CX_BITMAP, CY_BITMAP, hdc, 0, 0, SRCPAINT);
DeleteDC(hdc);
/ *如果项目具有焦点,请绘制焦点矩形。*/
if(lpdis- > itemState & ODS_FOCUS)
DrawFocusRect(lpdis- > hDC,& lpdis- > rcItem);
break;
case WM_COMMAND:
开关(LOWORD(wParam)){
case IDCOMBO:
if (HIWORD(wParam) == CBN_SELENDOK) {
InitFoodList(hwndDlg);
SendDlgItemMessage(hwndDlg,IDLIST,
LB_SETCURSEL, 0, 0);
}
break;
case IDLIST:
if (HIWORD(wParam) != LBN_DBLCLK)
break;
/ *要双击,请处理OK案例。*/
case IDOK:
/ *获取所选列表项的文本。*/
hwnd = GetDlgItem(hwndDlg, IDLIST);
SendMessage(hwnd,LB_GETTEXT,
SendMessage(hwnd,LB_GETCURSEL,0,0),
(LPARAM) achTemp);
/ *将文本插入编辑窗口。*/
SendMessage(hwndEdit,EM_REPLACESEL,0,
(LPARAM) achTemp);
EndDialog(hwndDlg, 0);
break;
case IDCANCEL:
hwnd = GetDlgItem(hwndDlg, IDCOMBO);
if(SendMessage(hwnd,CB_GETDROPPEDSTATE,
0, 0))
SendMessage(hwnd,CB_SHOWDROPDOWN,
FALSE, 0);
其他
EndDialog(hwndDlg, 0);
}
break;
case WM_DESTROY:
/*
*调用应用程序定义的函数释放
*位图资源。
*/
DeleteIconBitmaps();
break;
默认:
return FALSE;
}
return TRUE;
}
/********************************************************
功能:InitGroupList
目的:初始化“食物组”下拉菜单
列表框。
评论:与食品组相关的ID
每个列表项目被保存为项目数据。
*********************************************************/
BOOL PASCAL InitGroupList(HWND hwndDlg)
{
HWND hwndCombo = GetDlgItem(hwndDlg, IDCOMBO);
DWORD dwIndex;
/ *为每个食物组添加一个项目。*/
LoadString(hinst, ID_BREAD, achTemp, sizeof(achTemp));
dwIndex = SendMessage(hwndCombo, CB_ADDSTRING, 0,
(LPARAM) (LPCSTR) achTemp);
SendMessage(hwndCombo, CB_SETITEMDATA, dwIndex, ID_BREAD);
LoadString(hinst, ID_DAIRY, achTemp, sizeof(achTemp));
dwIndex = SendMessage(hwndCombo, CB_ADDSTRING, 0,
(LPARAM) (LPCSTR) achTemp);
SendMessage(hwndCombo, CB_SETITEMDATA, dwIndex, ID_DAIRY);
LoadString(hinst, ID_FRUIT, achTemp, sizeof(achTemp));
dwIndex = SendMessage(hwndCombo, CB_ADDSTRING, 0,
(LPARAM) (LPCSTR) achTemp);
SendMessage(hwndCombo, CB_SETITEMDATA, dwIndex, ID_FRUIT);
LoadString(hinst, ID_MEAT, achTemp, sizeof(achTemp));
dwIndex = SendMessage(hwndCombo, CB_ADDSTRING, 0,
(LPARAM) (LPCSTR) achTemp);
SendMessage(hwndCombo, CB_SETITEMDATA, dwIndex, ID_MEAT);
return TRUE;
}
/********************************************************
功能:InitFoodList
目的:清除食物清单的内容
添加当前食物的名称
食品组。
*********************************************************/
void PASCAL InitFoodList(HWND hwndDlg)
{
HWND hwndCombo = GetDlgItem(hwndDlg, IDCOMBO);
HWND hwndList = GetDlgItem(hwndDlg, IDLIST);
UINT idFoodGroup;
LPSTR lpsz;
LPSTR lpszEnd;
/ *确定目前的食物组。*/
idFoodGroup = SendMessage(
hwndCombo,
CB_GETITEMDATA,
SendMessage(hwndCombo,CB_GETCURSEL,0,0),
0
);
/ *清除列表内容。*/
SendMessage(hwndList, LB_RESETCONTENT, 0, 0);
.
./ *为当前食物组添加食物名称。*/
.
}