Frost Moon Project

Win32APIでタブコントロールを実装する - Frost Moon Project アクセスランキング

Home > Tips > Win32APIでタブコントロールを実装する

Win32APIでタブコントロールを実装する

  1. スクリーンショット
  2. ダウンロード
  3. ソース閲覧
    1. main.cpp
    2. resource.rc
    3. resource.h
    4. manifest.xml

スクリーンショット


ダウンロード
[Source&Binary]Tab.zip(120122)
size: 7.75KB md5: a031b165dc0281cc5001d9af52f5c65b
ソース閲覧
main.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
#define STRICT
#define WIN32_LEAN_AND_MEAN
 
#include <windows.h>
#include <commctrl.h>
 
#include "resource.h"
 
#define ID_TAB1 0
#define ID_TAB2 1
 
#define WM_CLOSETAB (WM_APP+100)
 
HINSTANCE g_hInstance;
 
BOOL CALLBACK Tab1Proc(HWND hDlg,UINT uMsg,WPARAM wParam,LPARAM lParam){
    switch(uMsg){
        case WM_INITDIALOG:{
            /*
            * TODO: Add code to initialize the dialog.
            */
            HWND hEdit=GetDlgItem(hDlg,IDC_EDIT1);
 
            SendMessage(hEdit,EM_SETSEL,(WPARAM)GetWindowTextLength(hEdit),(LPARAM)GetWindowTextLength(hEdit));
            SendMessage(hEdit,EM_REPLACESEL,(WPARAM)0,(LPARAM)"タブコントロールの\n");
 
            SendMessage(hEdit,EM_SETSEL,(WPARAM)GetWindowTextLength(hEdit),(LPARAM)GetWindowTextLength(hEdit));
            SendMessage(hEdit,EM_REPLACESEL,(WPARAM)0,(LPARAM)"てすと\n");
            return true;
        }
 
        case WM_COMMAND:
            /*
            * TODO: Add more control ID's, when needed.
            */
            break;
 
        case WM_CLOSETAB:
            return true;
    }
 
    return false;
}
 
BOOL CALLBACK Tab2Proc(HWND hDlg,UINT uMsg,WPARAM wParam,LPARAM lParam){
    switch(uMsg){
        case WM_INITDIALOG:
            /*
            * TODO: Add code to initialize the dialog.
            */
            break;
 
        case WM_CLOSETAB:
            return true;
    }
 
    return false;
}
 
bool CALLBACK DialogProc(HWND hDlg,UINT uMsg,WPARAM wParam,LPARAM lParam){
    static HWND hTab;
    static HWND hTab1;
    static HWND hTab2;
 
    switch (uMsg){
        case WM_INITDIALOG:{
            hTab=GetDlgItem(hDlg,IDC_TAB1);
 
            //タブ追加
            TC_ITEM TabItem;
 
            TabItem.mask=TCIF_TEXT;
            TabItem.pszText=(char*)"Tab1";
            TabCtrl_InsertItem(hTab,ID_TAB1,&TabItem);
 
            TabItem.mask=TCIF_TEXT;
            TabItem.pszText=(char*)"Tab2";
            TabCtrl_InsertItem(hTab,ID_TAB2,&TabItem);
 
            //タブ(ダイアログ)作成
            hTab1=CreateDialog(g_hInstance,MAKEINTRESOURCE(IDD_TAB1),hDlg,(DLGPROC)Tab1Proc);
            hTab2=CreateDialog(g_hInstance,MAKEINTRESOURCE(IDD_TAB2),hDlg,(DLGPROC)Tab2Proc);
 
            //タブの座標取得
            RECT rc;
            LPPOINT lpt=(LPPOINT)&rc;
 
            GetClientRect(hTab,&rc);
            TabCtrl_AdjustRect(hTab,false,&rc);
            //座標変換
            MapWindowPoints(hTab,hDlg,lpt,2);
 
            //タブの位置とサイズの調整
            MoveWindow(hTab1,
                        rc.left,
                        rc.top,
                        rc.right-rc.left,
                        rc.bottom-rc.top,
                        false
            );
            MoveWindow(hTab2,
                        rc.left,
                        rc.top,
                        rc.right-rc.left,
                        rc.bottom-rc.top,
                        false
            );
 
            //タブを表示
            ShowWindow(hTab1,SW_SHOW);
            ShowWindow(hTab2,SW_HIDE);
            TabCtrl_SetCurFocus(hTab,ID_TAB1);
            return true;
        }
 
        case WM_NOTIFY:{
            switch(((LPNMHDR)lParam)->idFrom){
                case IDC_TAB1:
                    switch(((LPNMHDR)lParam)->code){
                        case TCN_SELCHANGE:
                            switch(TabCtrl_GetCurSel(hTab)){
                                case ID_TAB1:
                                    ShowWindow(hTab1,SW_SHOW);
                                    ShowWindow(hTab2,SW_HIDE);
                                    return true;
                                case ID_TAB2:
                                    ShowWindow(hTab1,SW_HIDE);
                                    ShowWindow(hTab2,SW_SHOW);
                                    return true;
                                default:
                                    break;
                            }
                            break;
                        default:
                            break;
                    }
            }
            break;
        }
 
        case WM_COMMAND:
            switch(LOWORD(wParam)){
                /*
                * TODO: Add more control ID's, when needed.
                */
                case IDC_BTN_QUIT:
                    EndDialog(hDlg,0);
                    return true;
 
                case IDC_BTN_TEST:
                    MessageBox(hDlg,"You clicked \"Test\" button!","Information",MB_ICONINFORMATION);
                    return true;
            }
 
        case WM_CLOSE:
            EndDialog(hDlg,0);
            return true;
 
        default:
            return false;
    }
    return false;
}
 
 
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd){
    g_hInstance=hInstance;
 
    // The user interface is a modal dialog box
    return DialogBox(hInstance,MAKEINTRESOURCE(DLG_MAIN),NULL,(DLGPROC)DialogProc);
}
        


resource.rc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// Generated by ResEdit 1.5.8
// Copyright (C) 2006-2011
 
#include <windows.h>
#include <commctrl.h>
#include <richedit.h>
#include "resource.h"
 
 
 
 
//
// Dialog resources
//
LANGUAGE LANG_JAPANESE, SUBLANG_JAPANESE_JAPAN
DLG_MAIN DIALOGEX 6, 5, 194, 106
STYLE DS_3DLOOK | DS_CENTER | DS_SETFONT | WS_CAPTION | WS_VISIBLE | WS_GROUP | WS_THICKFRAME | WS_SYSMENU
CAPTION "Code::Blocks Template Dialog App"
FONT 8, "Tahoma", 0, 0, 1
{
    PUSHBUTTON      "&Test", IDC_BTN_TEST, 138, 5, 46, 15
    PUSHBUTTON      "&Quit", IDC_BTN_QUIT, 138, 29, 46, 15
    CONTROL         "", IDC_TAB1, WC_TABCONTROL, 0, 8, 7, 120, 90
}
 
 
 
LANGUAGE LANG_JAPANESE, SUBLANG_JAPANESE_JAPAN
IDD_TAB1 DIALOG 0, 0, 120, 80
STYLE DS_3DLOOK | DS_CENTER | DS_SHELLFONT | WS_VISIBLE | WS_CHILDWINDOW
FONT 8, "Ms Shell Dlg 2"
{
    EDITTEXT        IDC_EDIT1, 9, 10, 100, 50, ES_AUTOHSCROLL | ES_MULTILINE
}
 
 
 
LANGUAGE LANG_JAPANESE, SUBLANG_JAPANESE_JAPAN
IDD_TAB2 DIALOG 0, 0, 120, 80
STYLE DS_3DLOOK | DS_CENTER | DS_SHELLFONT | WS_VISIBLE | WS_CHILDWINDOW
FONT 8, "Ms Shell Dlg 2"
{
    CONTROL         "", IDC_DATETIMEPICKER1, DATETIMEPICK_CLASS, WS_TABSTOP | DTS_RIGHTALIGN, 11, 23, 100, 15
}
 
 
 
//
// Manifest resources
//
LANGUAGE LANG_JAPANESE, SUBLANG_JAPANESE_JAPAN
1                  RT_MANIFEST    ".\\manifest.xml"
 
    


resource.h
1
2
3
4
5
6
7
8
9
10
11
12
13
#ifndef IDC_STATIC
#define IDC_STATIC (-1)
#endif
 
#define DLG_MAIN                                101
#define IDD_TAB1                                103
#define IDD_TAB2                                105
#define IDC_EDIT1                               1000
#define IDC_BTN_TEST                            1001
#define IDC_BTN_QUIT                            1002
#define IDC_DATETIMEPICKER1                     1003
#define IDC_TAB1                                1003
    


manifest.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*"/>
    </dependentAssembly>
  </dependency>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel
          level="asInvoker"
          uiAccess="false"/>
      </requestedPrivileges>
    </security>
  </trustInfo>
</assembly>
    

Copyright(C) 2007-2025 Frost Moon Project


Home > Tips > Win32APIでタブコントロールを実装する