TABインデックス単位でEnableWindow(false)を行うとTABに置いたコントールすべてが入力不可(VBでいうとLOCK(TRUE))となりますが非活性になりません。
さらに、TAB自体選択可能です。
VBではTABインデックス単位で非活性・選択不可にできるのですが、VC++では無理なのでしょうか?
-環境-
・VC++ 6.0
・MFC
・ダイアログベース
-参考-
TC_ITEM item;
::memset(&item, 0, sizeof(TC_ITEM));
item.mask = TCIF_TEXT;
item.pszText = "XXX";
m_Tab.InsertItem(0, &item);
m_OptionTab1.Create(IDD_OPTION_TAB1, &m_Tab);
ある条件で
m_OptionTab1.EnableWindow(false);
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
No.3です。
サンプルですが、以下のような感じで良いと思います。色づけ部分だけですが…。
class CTabCtrlEx : public CTabCtrl
{
: // 途中省略
public:
BOOL IsTabEnabled(int nTab); // Tab Indexが使用可能か
BOOL SubclassDlgItem(UINT nID, CWnd* pParent); // SubClassのOverride
protected:
void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
void OnDrawText(CDC& dc, CRect rc, CString sText, BOOL bDisabled);
};
// CTabCtrlEx
void CTabCtrlEx::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
DRAWITEMSTRUCT& ds = *lpDrawItemStruct;
int iItem = ds.itemID;
// Tab 情報
char cText[128];
TCITEM tcItem;
tcItem.mask = TCIF_TEXT;
tcItem.pszText = cText;
tcItem.cchTextMax = sizeof(cText);
GetItem(iItem, &tcItem);
// DrawItem
CDC dc;
dc.Attach(ds.hDC);
// Rect Angle と色の設定
CRect rc = ds.rcItem;
rc += CPoint(1, 4);// 適当に…
// テキスト描画
OnDrawText(dc, rc, cText, !IsTabEnabled(iItem));
dc.Detach();
}
BOOL CTabCtrlEx::IsTabEnabled(int nTab)
{
// 例えばTab2番目ならば使用不能。それ以外は使用可能
if (nTab != 2) return TRUE;
return FALSE;
}
void CTabCtrlEx::OnDrawText(CDC& dc, CRect rc, CString sText, BOOL bDisabled)
{
dc.SetTextColor(GetSysColor(bDisabled ? COLOR_3DHILIGHT : COLOR_BTNTEXT));
dc.DrawText(sText, &rc, DT_CENTER|DT_VCENTER);
if (bDisabled) {
rc += CPoint(-1,-1);
dc.SetTextColor(GetSysColor(COLOR_GRAYTEXT));
dc.DrawText(sText, &rc, DT_CENTER|DT_VCENTER);
}
}
BOOL CTabCtrlEx::SubclassDlgItem(UINT nID, CWnd* pParent)
{
if (!CTabCtrl::SubclassDlgItem(nID, pParent)) return FALSE;
ModifyStyle(0, TCS_OWNERDRAWFIXED);
return TRUE;
}
// 実装クラス
BOOL CHogeDlg::OnInitDialog()
{
CDialog::OnInitDialog();
: // 途中省略
m_ctlTabCtrl.SubclassDlgItem(IDC_TAB1, this); // サブクラス化
m_ctlTabCtrl.InsertItem(0, _T("Hoge1")); // Index追加
m_ctlTabCtrl.InsertItem(1, _T("Hoge2"));
m_ctlTabCtrl.InsertItem(2, _T("Hoge3"));
m_ctlTabCtrl.InsertItem(3, _T("Hoge4"));
return TRUE; // フォーカスをコントロールに設定した場合を除き、TRUE を返します。
}
上記以外にキーボード押下による処理とか、IsTabEnabledでFALSEが返ってきたIndexはtab押下を拒否するとか追加してあげれば良いと思います。
ありがとうございます
TABインデックスの選択不可はOnSelchangeTabOptionメソッドでうまくできました
あとは、TABインデックスの文字を非活性に見せるということで、サンプルを参考にさせていただきます
No.3
- 回答日時:
>VBではTABインデックス単位で非活性・選択不可にできるのですが、VC++では無理なのでしょうか?
基本的にWindowsアプリに関して(難易度は別にして)VC++で出来ない事はありません。
さて、インデックス単位でEnable/Disableですが、残念ながら標準的には関数として用意されてはいません。
ですのでサブクラス化し、カスタムドローを用いて描画してあげれば良いと思います。
この回答への補足
ありがとうございます
>VC++で出来ない事はありません。
サンプルを探しても見つからなかったので、「できないの?」と思ったのですが、サブクラス化で可能なんですね
サンプルがあると助かるのですが...
VB暦の方が長いので、VC++の画面制御に色々苦戦しています
(VB感覚で考えてしまうので)
(C自体はVBより長いです)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- モニター・ディスプレイ どのモニターを買うか迷っているのですが、 5 2022/05/03 09:57
- モニター・ディスプレイ HDMI分配器をつければ、モニター3台は使用可能になりますか? 8 2023/02/02 20:03
- モニター・ディスプレイ HDMI変換器をつければ、モニター3台は使用可能になりますか? 5 2023/02/28 18:45
- モニター・ディスプレイ 現在、使用しているPCにモニター3台は繋がりますか? 4 2023/03/04 19:36
- モニター・ディスプレイ 現在、使用しているPCに、モニター3台が繋がらない。 4 2023/03/09 20:06
- 美顔器・脱毛器・電気シェーバー 光脱毛器 ブラウンで髭を薄くしたいのですが 新品を買った方がいい? 1 2023/02/06 14:14
- Visual Basic(VBA) Excel VBAシートの色を一気に変える方法 1 2022/03/27 23:24
- その他(ゲーム) ファミコンの「コズミックウォーズ」のような、PCゲーム(steam)を探しています 1 2023/04/03 19:45
- HTML・CSS CSS のみのタブ切り替えについて 1 2023/01/11 16:47
- Access(アクセス) エクセルのマクロについて教えてください。 2 2023/02/04 14:20
このQ&Aを見た人はこんなQ&Aも見ています
-
とっておきの「夜食」教えて下さい
真夜中に小腹がすいたときにこっそり作るメニュー、こっそり家を抜け出して食べに行くお店… 人には言えない、けど自慢したい、そんなあなたの「とっておきの夜食」を教えて下さい。
-
家・車以外で、人生で一番奮発した買い物
どんなものにお金をかけるかは人それぞれの価値観ですが、 誰もが一度は清水の舞台から飛び降りる覚悟で、ちょっと贅沢な買い物をしたことがあるはず。
-
初めて自分の家と他人の家が違う、と意識した時
子供の頃、友達の家に行くと「なんか自分の家と匂いが違うな?」って思いませんでしたか?
-
この人頭いいなと思ったエピソード
一緒にいたときに「この人頭いいな」と思ったエピソードを教えてください
-
タイムマシーンがあったら、過去と未来どちらに行く?
20XX年、ついにタイムマシーンが開発されました。 あなたは過去に行く? それとも未来? タイムマシーンにのって、どこに行って、何をしたいか教えてください!
-
画面を強制的に再描画させる方法
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【gcc・cygwin】multiple defin...
-
C# KeyDownイベントでショート...
-
既定のコンストラクタがありま...
-
多重定義が起きている?--lnk20...
-
C++にてtemplateで受け取った任...
-
クラス間でのクラスの共有?
-
Notepad++の関数リスト表示の変...
-
(void)0 はどんな意味ですか
-
CreateThreadのエラー
-
void*型の配列について
-
無名ネームスペース中のstatic...
-
VC++でGetKeyboardStateがうま...
-
Delphiの定数とローカル変数の...
-
C言語 ① 5秒間 1秒間隔で点滅を...
-
関数ポインタについて
-
戻り値を返す関数の前に(void)...
-
Arduinoでの圧電スピーカーとタ...
-
静的でないメンバ関数の呼び出...
-
Win10のVS2022のForm AppからC...
-
4桁7セグでダイナミック点灯
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【gcc・cygwin】multiple defin...
-
静的でないメンバ関数の呼び出...
-
C++にてtemplateで受け取った任...
-
戻り値を返す関数の前に(void)...
-
多重定義が起きている?--lnk20...
-
既定のコンストラクタがありま...
-
C# Controls.Addで動的に配置し...
-
(void)0 はどんな意味ですか
-
int main()、void main()、void...
-
const_castのつかいどころを教...
-
C# KeyDownイベントでショート...
-
VC++でGetKeyboardStateがうま...
-
void*型の配列について
-
C#でラジオボタンを設定に記録...
-
Notepad++の関数リスト表示の変...
-
ArduinoでMouse関数を使用して...
-
_beginthreadにて発生するコン...
-
ウインドウの移動禁止
-
コールバックって・・・
-
構造体を宣言と共に初期化する方法
おすすめ情報