- ベストアンサー
長さの違うチェックボックスの実現方法
- 長さの違うチェックボックスの実現方法について相談をいたします。
- 質問者は、本の管理プログラムにおいてジャンル名の表示に問題が発生しています。
- 質問者は、チェックボックスの幅を文字列の長さに合わせる方法を探していますが、見つかりませんでした。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
自分なら各タブに別々のダイアログウィンドウを作って貼り付けます static HWND hTab, hTabCtrl1, hTabCtrl2, hTabCtrl3; void DlgInit(HWND hDlg) { HINSTANCE hInst; TC_ITEM tc; RECT rt; LPPOINT pt = (LPPOINT)&rt; hInst = (HINSTANCE)GetWindowLong(hDlg, GWLP_HINSTANCE); hTab = GetDlgItem(hDlg, IDC_TAB1); // タブコントロールにタブシートを挿入 tc.mask = TCIF_TEXT; tc.pszText = TEXT("小説"); TabCtrl_InsertItem(hTab , 0, &tc); tc.mask = TCIF_TEXT; tc.pszText = TEXT("科学"); TabCtrl_InsertItem(hTab , 1, &tc); tc.mask = TCIF_TEXT; tc.pszText = TEXT("技術"); TabCtrl_InsertItem(hTab , 2, &tc); // タブに貼り付けるダイアログを生成 hTabCtrl1 = CreateDialog(hInst, (LPCTSTR)IDD_TAB1, hDlg, (DLGPROC)TabCtrlProc1); hTabCtrl2 = CreateDialog(hInst, (LPCTSTR)IDD_TAB2, hDlg, (DLGPROC)TabCtrlProc2); hTabCtrl3 = CreateDialog(hInst, (LPCTSTR)IDD_TAB3, hDlg, (DLGPROC)TabCtrlProc3); // タブコントロールのクライアント領域の座標を取得 GetClientRect(hTab, &rt); TabCtrl_AdjustRect(hTab, FALSE, &rt); // 親ウィンドウがhDlgなのでタブのマップが必要 MapWindowPoints(hTab, hDlg, pt, 2); // タブのウィンドウの位置とサイズを変更する MoveWindow(hTabCtrl1, rt.left, rt.top, rt.right - rt.left, rt.bottom - rt.top, FALSE); MoveWindow(hTabCtrl2, rt.left, rt.top, rt.right - rt.left, rt.bottom - rt.top, FALSE); MoveWindow(hTabCtrl3, rt.left, rt.top, rt.right - rt.left, rt.bottom - rt.top, FALSE); // デフォルトでタブ1を表示 ShowWindow(hTabCtrl1, SW_SHOW); } hDlgはタブコントロールを持つダイアログウィンドウのハンドルでIDC_TAB1がタブコントロールのIDです IDD_TAB1-3が各タブ用に作ったダイアログリソースのIDになります この関数をWM_INITDIALOGで呼び出します
その他の回答 (2)
- php504
- ベストアンサー率42% (926/2160)
続き ダイアログリソースです リソースエディタで作ったので大きさや位置は適当です IDD_DIALOG1 DIALOGEX 0, 0, 316, 183 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Dialog" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN DEFPUSHBUTTON "OK",IDOK,205,162,50,14 PUSHBUTTON "キャンセル",IDCANCEL,259,162,50,14 CONTROL "",IDC_TAB1,"SysTabControl32",0x0,7,7,302,132 END IDD_TAB1 DIALOGEX 0, 0, 316, 183 STYLE DS_SETFONT | DS_CONTROL | WS_CHILD FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN CONTROL "日常",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,22,30,74,10 CONTROL "業界",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,103,33,61,10 CONTROL "非日常",IDC_CHECK3,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,197,31,61,10 CONTROL "ファンタジー",IDC_CHECK4,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,41,102,61,10 CONTROL "SF",IDC_CHECK5,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,155,103,61,10 END IDD_TAB2 DIALOGEX 0, 0, 316, 183 STYLE DS_SETFONT | DS_CONTROL | WS_CHILD FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN CONTROL "物理",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,22,30,74,10 CONTROL "数学",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,103,33,61,10 CONTROL "化学",IDC_CHECK3,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,197,31,61,10 CONTROL "宇宙・地学",IDC_CHECK4,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,41,102,61,10 CONTROL "心理学",IDC_CHECK5,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,155,103,61,10 END IDD_TAB3 DIALOGEX 0, 0, 316, 183 STYLE DS_SETFONT | DS_CONTROL | WS_CHILD FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN CONTROL "コンピュータ",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,22,30,74,10 CONTROL "ロボット",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,197,31,61,10 CONTROL "家電",IDC_CHECK3,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,41,102,61,10 END
補足
前略 stalin28 まずは報告が遅れたことをお詫びいたします。現在はコンパイルを通過したところなのですが、タブの内容が表示できていない状況です。寝るまでにもコードと睨めっこするつもりですが間に合わないと思いますので、明日の報告をお待ちいただくよう、お願い申し上げます。 草々
- php504
- ベストアンサー率42% (926/2160)
タブの切り替えに応じて表示するダイアログを変更します static int SelectedTab; LRESULT CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) { NMHDR *nm = (NMHDR *)lParam; switch (msg) { case WM_INITDIALOG: DlgInit(hDlg); return TRUE; case WM_NOTIFY: // タブコントロールの選択されているタブが変更されたことを通知 switch (nm->code) { case TCN_SELCHANGE: if (nm->hwndFrom == hTab) { SelectedTab = TabCtrl_GetCurSel(hTab); switch (SelectedTab) { case 0: ShowWindow(hTabCtrl1, SW_SHOW); ShowWindow(hTabCtrl2, SW_HIDE); ShowWindow(hTabCtrl3, SW_HIDE); break; case 1: ShowWindow(hTabCtrl1, SW_HIDE); ShowWindow(hTabCtrl2, SW_SHOW); ShowWindow(hTabCtrl3, SW_HIDE); break; case 2: ShowWindow(hTabCtrl1, SW_HIDE); ShowWindow(hTabCtrl2, SW_HIDE); ShowWindow(hTabCtrl3, SW_SHOW); break; } return TRUE; } break; } case WM_COMMAND: if(HIWORD(wParam) == BN_CLICKED) { switch (LOWORD(wParam)) { case IDOK: EndDialog(hDlg, LOWORD(wParam)); return TRUE; case IDCANCEL: EndDialog(hDlg, LOWORD(wParam)); return TRUE; } } break; } return FALSE; } int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow) { DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), NULL, (DLGPROC)DlgProc); return 0; }
補足
前略 stalin28です。 間違えて真ん中の2番目に最終報告をいたします。結局void DlgInit(HWND hDlg)内で、 hTab = GetDlgItem(hDlg, IDC_TAB1); をコピペし忘れただけと判明いたしました。 今回の相談については問題点が明確だったためか、php504さんの適切な助言で実質一回の回答で解決できたことを感謝いたします。しかし「猫でも」も基礎は教えてもらえるけど、今回のようなちょっとしたコツについてはサイトも含めて確認できませんでした。また「createdialog」と「タブ」をググれば望みのサイトが見つかるのですが、 createdialogを使うことを知らなければ辿り着けないでしよう。 私もなるべくなら質問したくないと思い、今回もこちらのサイトを含めてさんざん検索を掛けたつもりなのですが、的確な答えが無かったので、また他の人にも有益な問題と思えたので今回質問することとなりました。即座に返答(実際には回答)してくれたphp504さんには、重ね重ね感謝いたします。 有り難うございました。 草々
補足
前略 stalin28です。 php504さん、早速のご回答、感謝いたします。でも検証のほうは自分で追加しなければならない関数があるために、今日中には無理のようです。とはいっても経験者があることを前提に多少説明を省いたところがあるのですが、問題を的確に理解してくださり適切な助言をしてくださいましたこと、有り難うございました。たぶん大丈夫だろうとは思いますが、念のため検証するまで締め切らないでおきます。 草々