お久しぶりです。
現在死ぬ気であるソフトウェアを製作しているのですが
ひとつ問題が発生しました。
このソフトではタブコントロールをつかいます。
ウィンドウに「ぺたっ」とタブコントロールを載せています。
そのタブの中に、リストビューを入れたいと思っています。
タブを切り替えたらもちろん消えたり、出たり。
参考として
http://gurigumi.s349.xrea.com/programmi ... _tab2.html
http://wisdom.sakura.ne.jp/system/winap ... mon11.html
を見てみたのですが
どうも上手くいきません。
どうやったらいいのでしょう?
タブコントロールの上にリストビューを載せる[WIN32 API]
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: タブコントロールの上にリストビューを載せる[WIN32 API]
プロパティシートを使ってダイアログを切り替えれば出来ると思いますが?
※ MFCの人なので細かいところは実際にWin32APIでやったことが無いです。
「プロパティシート」
http://wisdom.sakura.ne.jp/system/winap ... mon12.html
※ MFCの人なので細かいところは実際にWin32APIでやったことが無いです。
「プロパティシート」
http://wisdom.sakura.ne.jp/system/winap ... mon12.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: タブコントロールの上にリストビューを載せる[WIN32 API]
あっダメかウィンドウ上なんですね。
ダメを状態を再現するコンパクトな再現コードを貼ってもらった方が良いでしょう。
ダメを状態を再現するコンパクトな再現コードを貼ってもらった方が良いでしょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: タブコントロールの上にリストビューを載せる[WIN32 API]
main.cpp
help.rc
header.h
resouce.h
こんな感じです。
症状としてはバグって延々と動かなくなります^^;
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
#include <windows.h>
#include <commctrl.h>
#include "resource.h"
#include "header.h"
#include <string.h>
#include <stdio.h>
#define X_MIN 240
#define Y_MIN 177
#define TITLE TEXT("Kitty on your lap")
LPCTSTR strItem[] = {TEXT("RENA") , TEXT("YUKI") , TEXT("MIMI")};
#pragma comment(lib, "comctl32.lib") // ステータスバーの作成に必要
TCHAR ver[] = TEXT("Ver.1.8.5.0");
TCHAR winName[60];
TCHAR T_Name[] = TEXT("A");
// 関数定義:
void InitInfo();
// グローバル変数:
HINSTANCE hInst; // 現在のインターフェイス
HWND hTab; // タブコントロールのハンドル
WNDPROC OrgListProc; //スタティックコントロールのプロシージャ
// このコード モジュールに含まれる関数の宣言を転送します:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK MyListProc(HWND, UINT, WPARAM, LPARAM);
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
MyRegisterClass(hInstance);
// アプリケーションの初期化を実行します:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
// メイン メッセージ ループ:
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int) msg.wParam;
}
//
// 関数: MyRegisterClass()
//
// 目的: ウィンドウ クラスを登録します。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInst;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1));
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = TEXT("MYMENU");
wcex.lpszClassName = T_Name;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_ICON1));
return RegisterClassEx(&wcex);
}
//
// 関数: InitInstance(HINSTANCE, int)
//
// 目的: メイン ウィンドウを作成します。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
hInst = hInstance; // グローバル変数にインスタンス処理を格納します。
InitInfo(); //ソフトウェア初期化処理
hWnd = CreateWindow(T_Name, winName, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if (!hWnd)
{
return FALSE;
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
//
// 関数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
// 目的: メイン ウィンドウのメッセージを処理します。
//
// WM_CREATE - ウインドウ作成時の処理
// WM_SIZE - ウインドウサイズ変更時の処理
// WM_GETMINMAXINFO - ウインドウサイズ・位置変更時の処理
// WM_COMMAND - アプリケーション メニューの処理
// WM_DESTROY - 中止メッセージを表示して戻る
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
int nTab;
static RECT rc;
TCITEM ti;
INITCOMMONCONTROLSEX ic;
LPMINMAXINFO lpmm;
static HWND hList, hEdit;
static TCHAR szStr[3][256];
switch (message)
{
case WM_CREATE:
//タブコントロール作成
ic.dwSize = sizeof(INITCOMMONCONTROLSEX);
ic.dwICC = ICC_TAB_CLASSES;
InitCommonControlsEx(&ic);
GetClientRect(hWnd, &rc);
hTab = CreateWindowEx(0,
WC_TABCONTROL, TEXT(""),
WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE ,
0, 0, rc.right, rc.bottom,
hWnd, (HMENU)ID_TAB, hInst, NULL);
SendMessage(hTab, WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), 0);
ti.mask = TCIF_TEXT;
ti.pszText = TEXT("タブ0");
TabCtrl_InsertItem(hTab, 0, &ti);
ti.pszText = TEXT("タブ1");
TabCtrl_InsertItem(hTab, 1, &ti);
ti.pszText = TEXT("タブ2");
TabCtrl_InsertItem(hTab, 2, &ti);
//リストビューコントロール作成
InitCommonControls();
hList = CreateWindowEx(0,
WC_LISTVIEW, 0,
WS_CHILD | WS_VISIBLE,
0, 0, CW_USEDEFAULT, CW_USEDEFAULT,
hWnd, (HMENU)ID_STATIC, hInst, NULL);
//リストビューコントロールサブクラス化
OrgListProc = (WNDPROC)GetWindowLong(hList, GWL_WNDPROC);
SetWindowLong(hList, GWL_WNDPROC, (LONG)MyListProc);
break;
case WM_SIZE:
GetClientRect(hWnd, &rc);
TabCtrl_AdjustRect(hTab, FALSE, &rc);
MoveWindow(hTab, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE);
MoveWindow(hList,
rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, TRUE);
break;
/* case WM_NOTIFY:
switch (((NMHDR *)lParam)->code) {
case TCN_SELCHANGE:
case TCN_SELCHANGING:
nTab = TabCtrl_GetCurSel(hTab);
//
// タブによって処理変更
//
// nTab = 1 ・・・・・・ MyListProc / タイマー
//
switch(nTab){
case 0:
break;
}
break;*/
case WM_GETMINMAXINFO:
lpmm = (LPMINMAXINFO)lParam;
lpmm->ptMinTrackSize.x = X_MIN;
lpmm->ptMinTrackSize.y = Y_MIN;
break;
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// 選択されたメニューの解析:
switch (wmId)
{
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
void InitInfo(){
//タイトルの作成
//[A] + [Ver番号]
wsprintf(winName,TEXT("%s %s"),T_Name , ver);
}
//サブクラス化されたスタティックコントロールのプロシージャ
LRESULT CALLBACK MyListProc(HWND hList , UINT msg , WPARAM wp , LPARAM lp) {
LVCOLUMN col;
LVITEM item = {0};
int iCount = 0;
switch (msg) {
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_CREATE:
InitCommonControls();
hList = CreateWindowEx(0 , WC_LISTVIEW , 0 ,
WS_CHILD | WS_VISIBLE | LVS_REPORT ,
0 , 0 , 10 , 10 , NULL , (HMENU)1 ,
((LPCREATESTRUCT)lp)->hInstance , NULL);
col.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH;
col.fmt = LVCFMT_LEFT;
col.cx = 100;
col.pszText = TITLE;
ListView_InsertColumn(hList , 0 , &col);
item.mask = LVIF_TEXT;
for ( ;iCount < 3 ; iCount++) {
item.pszText = (LPWSTR)strItem[iCount];
item.iItem = iCount;
ListView_InsertItem(hList , &item);
}
return 0;
case WM_SIZE:
MoveWindow(hList , 0 , 0 , LOWORD(lp) , HIWORD(lp) , FALSE);
return 0;
}
//return DefWindowProc(hWnd , msg , wp , lp);
}
// Generated by ResEdit 1.5.9
// Copyright (C) 2006-2011
// http://www.resedit.net
#include <windows.h>
#include <commctrl.h>
#include <richedit.h>
#include "resource.h"
//
// Menu resources
//
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
MYMENU MENU
BEGIN
POPUP "ファイル(&F)"
BEGIN
MENUITEM "アプリケーションの終了(&X)", IDM_EXIT
END
POPUP "ヘルプ(&H)"
BEGIN
MENUITEM "バージョン情報(&A)...", IDM_ABOUT
END
END
//
// Icon resources
//
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
IDI_ICON1 ICON ".\\icon1.ico"
#define ID_TAB 1001
#define IDM_ABOUT 104
#define IDM_EXIT 105
#define IDC_HP 109
#define ID_STATIC 1002
#ifndef IDC_STATIC
#define IDC_STATIC (-1)
#endif
#define IDM_ABOUT 104
#define IDM_EXIT 105
#define IDI_ICON1 107
こんな感じです。
症状としてはバグって延々と動かなくなります^^;
C,C++,C#,これらを極めることを「3C政策」と言う
Re: タブコントロールの上にリストビューを載せる[WIN32 API]
とりあえず文字は表示できました
問題はリストビューをどうやっておくかです^^;
問題はリストビューをどうやっておくかです^^;
C,C++,C#,これらを極めることを「3C政策」と言う
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: タブコントロールの上にリストビューを載せる[WIN32 API]
まったくの予想のレベルですが、3つのダイアログを子ウィンドウにしてタブの切り替えでダイアログの表示非表示を切り替える事で出来るかなと思います。リストビューはダイアログに載せてしまいます。
ループに成る原因はタイミング的なものでしょうか、デバッガで追うと無限ループになりません。
やはり、Win32APIは見慣れていないので追いづらい・・・。すいません夜また調べます。
ループに成る原因はタイミング的なものでしょうか、デバッガで追うと無限ループになりません。
やはり、Win32APIは見慣れていないので追いづらい・・・。すいません夜また調べます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: タブコントロールの上にリストビューを載せる[WIN32 API]
なるほど、子ウィンドウにするという手がありましたか!
確かにそうしたら簡単そうですね
色々ありがとうございます
確かにそうしたら簡単そうですね
色々ありがとうございます
C,C++,C#,これらを極めることを「3C政策」と言う
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: タブコントロールの上にリストビューを載せる[WIN32 API]
子ウィンドウ化した外枠の無いダイアログを乗っけるので良いと思います。オカピーα さんが書きました:外枠をはずしたダイアログを乗っけるというアイディアはどうでしょう?
無限ループの原因は分かっていませんがタブ関係なしに問題が起きそうな気もします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: タブコントロールの上にリストビューを載せる[WIN32 API]
全力でググってみたろころ、タブコントロールにスタティックを貼り付け、それを
親ウィンドウとしてリストビューを作るやり方でうまくいきました!
みなさんありがとうございます!(結局自力だけd(ry)
親ウィンドウとしてリストビューを作るやり方でうまくいきました!
みなさんありがとうございます!(結局自力だけd(ry)
C,C++,C#,これらを極めることを「3C政策」と言う