|
こんにちは エビス丸です。
経過報告に参りました。
経過と言うくらいでうまくいってません。
以下に示したソースで試しているのですが、
太字にするためのコードをどこに入れて、
標準に戻すのをどこに入れればよいのかがわかりません。
WM_INITDIALOGでADDITEMの前に入れると、最後の設定が全体に適用され、
WM_DRAWITEMで入れると、リストボックスの中身が高速で点滅し、
アプリそのものが不安定になってしまいます。
どこでどのように挿入してやればよいでしょうか。
もう一度アドバイスをいただけないでしょうか。
よろしくお願いいたします。
#見づらいソースで申し訳ありません。
/******************************/
/* リストボックス作成 */
/******************************/
HWND CreateControlWindow(HWND hwndParent, int Left, int Top,int Width, int Height,
int dwExStyle ,int dwFlag ,LPCTSTR Caption, LPCTSTR ClassName,
HMENU ChildID,HINSTANCE hInstance)
{
return CreateWindowEx(dwExStyle,ClassName,Caption,WS_CHILD | WS_VISIBLE | dwFlag ,
Left, Top, Width, Height, hwndParent, ChildID, hInstance, NULL);
}
/******************************/
/* フォント設定 */
/******************************/
void SetFont(HWND hwnd,int Height,
int Weight,BOOL Italic,BOOL Underlin,BOOL StrikeOut, LPCTSTR FontName)
{
hFont= (CreateFont(-12,0,0,0,Weight,Italic,Underlin,StrikeOut,SHIFTJIS_CHARSET,
OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH,FontName));
SendMessage(hwnd,WM_SETFONT,(WPARAM)hFont,TRUE);
}
/******************************/
/* ダイアログプロシージャ */
/* ※WinMainは省略 */
/******************************/
BOOL CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
{
LPDRAWITEMSTRUCT _DrawItem=(LPDRAWITEMSTRUCT)lp;
LPCTSTR _buffer;
HBRUSH hBrush;
HBITMAP hBMP;
//static HFONT hFont;
int i;
switch (msg) {
case WM_INITDIALOG:
//コントロール作成
hList= CreateControlWindow(hDlg,7,340,150,160,WS_EX_CLIENTEDGE,
LBS_OWNERDRAWFIXED | LBS_SORT | LBS_NOINTEGRALHEIGHT |
LBS_EXTENDEDSEL | LBS_DISABLENOSCROLL | WS_VSCROLL | WS_TABSTOP,
"","LISTBOX",(HMENU)IDC_LIST,
(HINSTANCE)GetWindowLong(hDlg, GWL_HINSTANCE));
//フォントの変更
SetFont(hList,-12,FW_REGULAR,FALSE,FALSE,FALSE,"MS ゴシック");
SendMessage(hList,LB_ADDSTRING,0,(LPARAM)(LPCTSTR)"新規作成");
SendMessage(hList,LB_ADDSTRING,0,(LPARAM)(LPCTSTR)"ファイルを開く");
SendMessage(hList,LB_ADDSTRING,0,(LPARAM)(LPCTSTR)"上書き保存");
SendMessage(hList,LB_ADDSTRING,0,(LPARAM)(LPCTSTR)"---------------");
SendMessage(hList,LB_ADDSTRING,0,(LPARAM)(LPCTSTR)"アプリケーションの終了");
//イメージリストを作成
InitCommonControls();
hImageList = ImageList_Create(16, 16, ILC_COLOR | ILC_MASK, 2, 0);
//イメージリストにビットマップを追加(100はリソースの番号を参照してください。)
for (i=1;i<4;i++)
{
hBMP = LoadBitmap((HINSTANCE)GetWindowLong(hDlg,GWL_HINSTANCE),(LPCTSTR)3000+i);
ImageList_AddMasked(hImageList, hBMP, RGB(0,255,255));
DeleteObject(hBMP);
}
return TRUE;
case WM_DRAWITEM:
//リストボックスだったら
if ((UINT) wp==IDC_LIST) {
//描画対象の文字列取得
SendMessage(hList,LB_GETTEXT,_DrawItem->itemID,(LPARAM)&_buffer);
//選択状態かチェック
if ((_DrawItem->itemState) & (ODS_SELECTED)) {
hBrush=CreateSolidBrush(RGB(255,0,0)); //ブラシ作成
SetTextColor(_DrawItem->hDC,RGB(255,255,255)); //テキストのカラーを設定
SetBkColor(_DrawItem->hDC,RGB(255,0,0)); //テキストの背景色を指定
} else {
hBrush=CreateSolidBrush(RGB(255,255,255)); //ブラシ作成
SetTextColor(_DrawItem->hDC,RGB(0,0,0)); //テキストのカラーを設定
SetBkColor(_DrawItem->hDC,RGB(255,255,255)); //テキストの背景色を指定
}
FillRect(_DrawItem->hDC,&_DrawItem->rcItem,hBrush); //バックグラウンドを塗りつぶす
DeleteObject(hBrush); //ブラシ削除
TextOut(_DrawItem->hDC,_DrawItem->rcItem.left+22,_DrawItem->rcItem.top+3,
_buffer,strlen(_buffer)); //テキストを描画
//ビットマップを描画(アイテムのインデックスが超えた場合はなにもされない)
ImageList_Draw(hImageList,_DrawItem->itemID,_DrawItem->hDC, 1,
_DrawItem->rcItem.top, ILD_TRANSPARENT);
}
return TRUE;
}
}
|