お酒好きのおしりトラブル対策とは

VC++2010 MFCで作成しているんですが、
ShowWindow(SW_MAXIMIZE)を使用し最大化で表示出来たんですが、上のメニューの所を
ダブルクリックすると元のサイズに戻ってしまうんですが、どのようにすれば元のサイズに戻らず
サイズも変更されずに最大化のまま表示できますか?
よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

作成したウィンドウをデスクトップサイズで作成して、通常のウィンドウサイズにはしたくない。


というのであれば、システムメニューから最大化を削除してウィンドウはサイズ変更可にしない(CWnd::Create()の第3引数でWS_THICKFRAMEを含まないもの)にして作成して下さい。
# 「MFC 最大化 システムメニュー 削除」あたりで検索を。
で、Cwnd::PreCreateWindow()でCREATESTRUCT構造体のx,y,cx,cyメンバを書き換えて下さい。
# CWnd::Create()での引数を調整する。なんてのもアリですけどね。
# デスクトップのサイズを知るには「デスクトップ サイズ 取得」あたりで検索を。
    • good
    • 0

サイズ固定したいのなら、ダイアログベースでアプリケーション作成するとかが手っ取り早いのでは。

    • good
    • 0

>上のメニューの所を


>ダブルクリックすると元のサイズに戻ってしまう

メニューバーですか?

キャプションバー、またはタイトルバーと言われるところではないですか?
通常のエクスプローラのウィンドウとかで、キャプションバーをダブルクリックすると、通常サイズと最大化が切り替えできますが……。

OSが送ってきているモノのようですから、そのままでは対処が難しいかも知れません。
WM_NCHITTESTの返却値をいぢれば「マウスカーソルのある位置はキャプションバーではない」とすることも可能かも知れませんが、
ドラッグでウィンドウを移動できなくなります。
キャプションバーのダブルクリックではなくともタスクバーのアイコンを右クリックとか、キーボードで出したシステムメニューでの操作も可能だったりしますし……。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q【VC++2005(CLR)】ダイアログ右上の最小化、最大化、閉じるボタンの制御の仕方を教えてください。

VC++初心者です。
たびたび、お世話になっております。

現在、VC++2005 Express Edition、CLRのプロジェクトで
コーディングしています。

基本的な質問だと思いますが、ダイアログ右上に配置される
最小化、最大化、閉じるボタンの制御の仕方を
教えていただけませんでしょうか。

具体的にはやりたいことは、以下のようなものです。
・閉じるボタンを押されたら、MessageBoxを表示させる。
・他のダイアログのボタンから別のダイアログの最大化ボタンが
 押されたことと同じ動作をする。

Aベストアンサー

No.1さんMFCではないですよ。

最大化、最小化は
FormのResizeイベントでWindowStateプロパティを見ればわかります。

System::Void Form1_Resize(System::Object^ sender, System::EventArgs^ e)
{
  if (this->WindowState == FormWindowState::Maximized) {
    MessageBox::Show(L"最大化");
  }
  else if (this->WindowState == FormWindowState::Minimized) {
    MessageBox::Show(L"最小化");
  }
}

×ボタンで閉じるはFormClosingやFormClosedあたりのイベントで。

>・他のダイアログのボタンから別のダイアログの最大化ボタンが
> 押されたことと同じ動作をする。
とは?
この前の子フォームのと関連しているということでしょうか?
最小化時にに子フォームのVisibleプロパティをfalseに、最小化が解除されたとき(=最大化だけとは限らない)にtrueにするだけですが。
(そもそも、親フォームに最大化ボタンは必要あるか。)

No.1さんMFCではないですよ。

最大化、最小化は
FormのResizeイベントでWindowStateプロパティを見ればわかります。

System::Void Form1_Resize(System::Object^ sender, System::EventArgs^ e)
{
  if (this->WindowState == FormWindowState::Maximized) {
    MessageBox::Show(L"最大化");
  }
  else if (this->WindowState == FormWindowState::Minimized) {
    MessageBox::Show(L"最小化");
  }
}

×ボタンで閉じるはFormClosingやFormClosedあたりのイベントで。

...続きを読む

Qボタンの表示の色、フォントを変更したい

VC++でプログラミングしています。
MFCのダイアログベースのEXEを造っています。
ダイアログにはボタンとエディットボックスを貼り付けています。
私がやりたいのは以下のことです。

・ボタンの色を設定したい
・ボタン、エディットボックスに表示する文字の色を設定したい
・ボタン、エディットボックスに表示する文字のフォント(サイズ)を設定したい

プロパティでサイズ変更すると全体に反映されてしまうので、個々の
コントロールについて制御したいと思っています。

ヘルプで調べて、それらしい関数を見つけるのですが使い方がわかりません。
VCを始めたばかりで、クラスの理解がまだ浅いです。。。
関数の説明は理解できても、「じゃあ、コードはどう書くの?」という状態です。
「○○ は ×× のメンバではありません」と、よく怒られてます。。。

識者の方、ご教授願います。
コードがどうなるのか知りたいので、簡単なサンプルコードがあると助かります。

また、質問ではないのですが、「この関数は○○をする」というのではなく、
「○○をするにはこの関数を使う」という様に調べられる、お勧めの書籍、
Webなどがありましたら教えてください。
今後の勉強に役立てたいと思っています。

VC++でプログラミングしています。
MFCのダイアログベースのEXEを造っています。
ダイアログにはボタンとエディットボックスを貼り付けています。
私がやりたいのは以下のことです。

・ボタンの色を設定したい
・ボタン、エディットボックスに表示する文字の色を設定したい
・ボタン、エディットボックスに表示する文字のフォント(サイズ)を設定したい

プロパティでサイズ変更すると全体に反映されてしまうので、個々の
コントロールについて制御したいと思っています。

ヘルプで調べ...続きを読む

Aベストアンサー

下2つについては以下でいけると思います。

class CMyDlg : CDialog
{
public:

  CFont m_cFont; //Dlgクラスのメンバとして用意
/*
  他のメンバ
*/
  virtual BOOL OnInitDialog(); //初期化

};


BOOL CMyDlg::OnInitDialog()
{
  //TODO:ここでFontを設定しておく(文字の色、サイズなど)

  //Fontを設定
  ((CButton *)GetDlgItem(IDC_BUTTON))->SetFont(&m_cFont,TRUE);

  //TODO:その他の初期化

  return TRUE;
}
//見易さのために、全角スペースを使っています;;

一番上はBitmapを貼り付けるか、CWndのメンバ関数を使って
塗りつぶすかどうかだと思います。

MFCではなく、C++Builderのページなのですが、少しいじればMFCでも使えるので、参考URLに示しておきます。

参考URL:http://market.agr.tottori-u.ac.jp/ken/tech.html

下2つについては以下でいけると思います。

class CMyDlg : CDialog
{
public:

  CFont m_cFont; //Dlgクラスのメンバとして用意
/*
  他のメンバ
*/
  virtual BOOL OnInitDialog(); //初期化

};


BOOL CMyDlg::OnInitDialog()
{
  //TODO:ここでFontを設定しておく(文字の色、サイズなど)

  //Fontを設定
  ((CButton *)GetDlgItem(IDC_BUTTON))->SetFont(&m_cFont,TRUE);

  //TODO:その他の初期化

  return TRUE;
}
//見易さのために、全角スペースを使って...続きを読む

Q最大化と最小化ボタン

Win32Applicationサンプルを作っていて疑問に思ったのですが。

(1) メインウィンドウの右上の閉じる「×」は必要ですが、最小化・最大化ボタンを「なくす」方法は、どうすれば良いのでしょう。
(2) ダイアログボックスで反対に最小化・最大化ボタンを「追加する」方法は、どうすれば良いのでしょう。

まず(1)を知りたいです。 VC++超初心者レベルとお考え下さい。 宜しくお願い致します。

Aベストアンサー

>(1) メインウィンドウの右上の閉じる「×」は必要ですが、
>最小化・最大化ボタンを「なくす」方法は、どうすれば良いのでしょう。

CreateWindowまたはCreateWindowExのパラメータで、ウィンドウスタイルを設定するパラメータで、WS_MINIMIZEBOXとWS_MAXIMIZEBOXを含まないスタイルを指定します。

http://yokohama.cool.ne.jp/chokuto/urawaza/prm/window_style.html

>(2) ダイアログボックスで反対に最小化・最大化ボタンを「追加する」方法は、どうすれば良いのでしょう。

ダイアログのデザインで、プロパティのスタイルに設定するところがあります。

QMFCのView終了時の終了確認

環境:WindowsXP + VisualStudio2010 + MFC

MFCのViewの終了処理に関して質問があります。
Viewの右上の×印をクリックした際に終了確認を表示して
ユーザーが終了を拒否した場合、Viewの終了を無効にしたい
と考えています。

MFCでこのような制御を行うには、どのようなイベントで
どのような処理をすれば良いのでしょうか?

ご存知の方がいたら教えて下さい。
どうぞ宜しくお願い致します。

Aベストアンサー

Viewと言われているのかわからないので違うかもしれませんが。
×印はシステムコマンドに該当する機能ですから、WM_SYSCOMMANDを使えば可能ですよ。
×印がクリックされるとnIDにSC_CLOSEが送られてきますから、メッセージボックスを出してNOならデフォルト処理を省略するようにすればいいです。

但し処理する場所はCMainFrameの方です。
WM_SYSCOMMANDのハンドラ作って、以下の感じで制御できます。

void CMainFrame::OnSysCommand(UINT nID, LPARAM lParam)
{
  if((nID != SC_CLOSE) || ((nID == SC_CLOSE) && (MessageBox(_T("終了しますか?"), _T("終了"), MB_YESNO) == IDYES))) {
    CFrameWndEx::OnSysCommand(nID, lParam);
  }
}

Q作成したウインドウのサイズを固定するには?

現在私はWin32APIの勉強中です><
現在参考書を片手に、
まず最初に真っ白の何もしないウインドウを作成してみました。

この作成したウインドウでは、マウスでウインドウの角をクリックしながらドラッグすると、ウインドウのサイズを自由に変更できます。

しかし、私はこのウインドウのサイズをこのようにマウス操作で変更することができないようにしたいのですが、どのようにしたらよいのでしょうか?
ご教授よろしくお願いいたします><

Aベストアンサー

前置き。
今のところスケルトンプログラム(ただウインドウを表示するプログラム)しか出来ないようでしたら、下の関数で、
まあ、とりあえず詳しく説明します。^_^


HWND CreateWindow(
LPCTSTR lpClassName, // 登録されているクラス名
LPCTSTR lpWindowName, // ウィンドウ名
DWORD dwStyle, // ウィンドウスタイル
int x, // ウィンドウの横方向の位置
int y, // ウィンドウの縦方向の位置
int nWidth, // ウィンドウの幅
int nHeight, // ウィンドウの高さ
HWND hWndParent, // 親ウィンドウまたはオーナーウィンドウのハンドル
HMENU hMenu, // メニューハンドルまたは子ウィンドウ ID
HINSTANCE hInstance, // アプリケーションインスタンスのハンドル
LPVOID lpParam // ウィンドウ作成データ
);

今、あなたが変更したいとおっしゃっているのは
上の
CreateWindow() 関数のウインドウスタイルという
3番目に DWORD dwStyle, // ウィンドウスタイル
と記述されているところを変えなければなりません。

大体は下のようなものが使われています。
WS_OVERLAPPEDWINDOW | WS_VISIBLE

WS_OVERLAPPEDWINDOW は、まあ現在表示されている
ウインドウになるまさしく犯人です。
もう一つの方は気にしないでください。
後、 | はたし算みたいな
記号と覚えておきましょう。
効果は WS_OVERLAPPEDWINDOW の機能に WS_VISIBLE の
機能を加えるみたいな感じです。

積もり積もった前置きはこのぐらいにして
回答。
WS_OVERLAPPEDWINDOW | WS_VISIBLE この部分を
WS_OVERLAPPED | WS_SYSMENU これにすると
閉じるボタン(×)だけ表示されウインドウのサイズは
変更できません。
WS_OVERLAPPEDWINDOW ^ WS_MAXIMIZEBOX ^ WS_THICKFRAME | WS_VISIBLE
こちらにすると
最小化は出来ますが、最大化およびサイズの変更は出来ません。

 ^ これについては、さっきの足し算とは逆に
引き算です。

まあ、他にも色々組み合わせはあるのですが希望
のものだと思います。
がんばってください。^_^

前置き。
今のところスケルトンプログラム(ただウインドウを表示するプログラム)しか出来ないようでしたら、下の関数で、
まあ、とりあえず詳しく説明します。^_^


HWND CreateWindow(
LPCTSTR lpClassName, // 登録されているクラス名
LPCTSTR lpWindowName, // ウィンドウ名
DWORD dwStyle, // ウィンドウスタイル
int x, // ウィンドウの横方向の位置
int y, // ウィンドウの縦方向の位置
int nWidth, // ウィンドウの幅
int n...続きを読む

QMFCでコンボボックスを選択不可状態にしたい

ダイアログ上にあるコンボボックスを選択不可状態にしたいのですが、
良い方法が見つかりません。
どなたか良い方法ご存知でしたら、ご教授お願い致します。

なお、この場合の選択不可とは、
コンボボックス上でクリックしても、
プルダウンされず、何も反応しないことを指します。
またコンボボックスのTypeは、ドロップダウンにて作成しています。

開発環境は、VC++2005です。
また、当方MFC経験2ヶ月程度の初心者ですので、
なるべく分かりやすい解説いただけると幸いです。

お手数ですが、御回答お願いいたします。

Aベストアンサー

CWnd::GetDlgItem()でコンボボックスのオブジェクトを取得し、
http://msdn.microsoft.com/ja-jp/library/77d16yhw(VS.80).aspx

CWnd::EnableWindow()で使用不可にする、
http://msdn.microsoft.com/ja-jp/library/5kbfsahf(VS.80).aspx

で行けるかと思います。
#MFC環境ないんで検証してません

Q【VC++2005】ダイアログサイズの固定の仕方について

VC++2005の超初心者です。

現在、ダイアログの大きさを固定しようと思うのですが、
ダイアログの淵にカーソルを持っていくと、ドラッグで
自由に縦横のサイズが変化してしまいます。

どうすれば、サイズを固定できるのでしょうか。
よろしくお願いします。

Aベストアンサー

マニュアルを見てみましょう。
http://msdn.microsoft.com/ja-jp/library/hw8kes41.aspx
といってもまぁよくわかんないですな。

画像付きのサイト
http://dobon.net/vb/dotnet/form/formborderstyle.html
も確認してみましょう。
違いがわかりやすいですね。

Qエディットボックスのフォントを変えたい

MFCで作ったダイアログ上の他のコントロールはいじらずに、
エディットボックスのフォントだけを大きく変えたいのですが、
行間が変わらない為か、文字の下のほうが切れてしまいます。

色々試してみていますが、どうしても出来ません。

元のダイアログのフォントは12ptです。

OnInitDialog関数内で、
CFont m_font;(メンバ変数)に以下を設定し、
m_font.CreateFont( 20, 0, 0, 0, FW_SEMIBOLD, FALSE, FALSE, 0, SHIFTJIS_CHARSET, OUT_TT_PRECIS,CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,DEFAULT_PITCH | FF_DONTCARE, "MS P ゴシック" );

OnCtlColor関数内で、該当エディットボックスの場合だけ
pDC->SelectObject( &m_font );
しています。

CreateFontのパラメータが間違っているのでしょうか?

それとも、これら関数を呼び出す場所が間違っているのでしょうか?

ご回答お待ちしております。

MFCで作ったダイアログ上の他のコントロールはいじらずに、
エディットボックスのフォントだけを大きく変えたいのですが、
行間が変わらない為か、文字の下のほうが切れてしまいます。

色々試してみていますが、どうしても出来ません。

元のダイアログのフォントは12ptです。

OnInitDialog関数内で、
CFont m_font;(メンバ変数)に以下を設定し、
m_font.CreateFont( 20, 0, 0, 0, FW_SEMIBOLD, FALSE, FALSE, 0, SHIFTJIS_CHARSET, OUT_TT_PRECIS,CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,DEFAULT_PIT...続きを読む

Aベストアンサー

こんにちは。

Senna_FFさんの回答とかぶりますが、SetFontで出来ます。
CreateFontの下に下記の一行を追加してみてください。
質問のCreatoFontは正しく動作していました。
IDC_EDITはフォントを変更したいエディットボックスのIDを入れてください。


GetDlgItem(IDC_EDIT)->SetFont(&m_font);

Qコンボボックス表示文字列を取得する場合

VC++ver6.0を使用しています。

コンボボックスのドロップダウンリストより
表示されている文字列を取得しようと思い、
下記のようにコーディングを行いました。


コンボボックスメンバ変数名:m_combo_year
ON_CBN_SELCHANGE(IDC_COMBO_HYOJI_SEIREKI, OnSelChangeComboHyojiSeireki)

void CKoyomiDlg::OnSelChangeComboHyojiSeireki()
{
 CString strComboYear;
 m_combo_year.GetWindowText(strComboYear);
}

実行すると、
ドロップダウンリストを
初期値2007 → 2006選択 → 2005選択
と、2回選択した場合
取得する値は
起動せず → 2007 → 2006
と、「選択した値」ではなく「表示していた値」を取得してしまいます。

何か解決策はございますでしょうか。

宜しくお願い致します。

Aベストアンサー

> m_combo_year.GetWindowText(strComboYear);
m_Combo_year.GetLBText(m_Combo_year.GetCurSel(), strComboYear);

QMFCのワーカースレッドとUIスレッドの使い分け

MFCのスレッドプログラミングに関して質問があります。

MFCにはワーカースレッドとUI(ユーザーインターフェース)スレッドの
2種類のスレッドがあるようですが、何が違って、どのように使い分けするのでしょうか?

ワーカースレッドは、このうような処理に、
UIスレッドは、このような処理に、
と言う感じで教えて頂けると助かります。

どいぞ宜しくお願い致します。

Aベストアンサー

ワーカースレッド(以下WS)でもユーザーインターフェイススレッド(以下UI)でも
スレッドはスレッドでMSが便宜上分けているだけということは覚えておいたほうが
いいです。

で、本題ですが、両者の最大の違いはメッセージポンプがあるかないかです。
メッセージポンプなしがWSで、ありがUIです。ですから、作成したスレッド内で
Windowsメッセージを処理しなければならないような場合、例えばセカンダリスレッドで
ウィンドウを作成して、時刻を表示するとか、ユーザの入力を受け付けて何らかの
処理を施すとかはUIを使います。
そうではなく、アプリがある種のサーバで、クライアントからの要求に対してデータを返却
するだけの処理のような場合はWSで行います。(まあ、クライアントからの要求に対して
いちいちWSを作るか、WaitForSingleObjectなどの待機関数で無限ループにするかなど実装
はいろいろありますが)

荒っぽい書き方をすると、Windowsのようなオブジェクト指向はUIで、旧来の
コンソールアプリのような手続き型はWSだともいえます。

最初にWSとUIは便宜上分けただけといいましたが、それはどちらもスレッドの制御関数は
同じで、スレッド作成時(AfxBeginThread)の引数で条件分岐しているだけなのがその理由です。
ですから、スレッドの制御関数を調べてみるとその違いがよくわかるので、以下のソースコードを
よくみてみてください。

thrdcore.cpp内のUINT APIENTRY _AfxThreadEntry(void* pParam)が制御関数で、どちらのスレッドを
使うにしてもこの関数がスレッドの制御関数として実行されるので中身をよく吟味してください。

ワーカースレッド(以下WS)でもユーザーインターフェイススレッド(以下UI)でも
スレッドはスレッドでMSが便宜上分けているだけということは覚えておいたほうが
いいです。

で、本題ですが、両者の最大の違いはメッセージポンプがあるかないかです。
メッセージポンプなしがWSで、ありがUIです。ですから、作成したスレッド内で
Windowsメッセージを処理しなければならないような場合、例えばセカンダリスレッドで
ウィンドウを作成して、時刻を表示するとか、ユーザの入力を受け付けて何らかの
処理を施すとかはUI...続きを読む


人気Q&Aランキング

おすすめ情報