• 締切済み

ウィンドウスタイルの変更

現象を文章で書きます。 まず始めに、ウィンドウスタイルにWS_BORDER | WS_CHILD | WS_VISIBLE | WS_THICKFRAME(サイズ変更境界を持つウィンドウ)を設定したボタンを作りました。 それを後の処理で style = GetWindowLongPtr(hWnd,GWL_STYLE); //ウィンドウスタイルの取得 style ^= WS_THICKFRAME; //style XOR WS_THICKFRAMESetWindowLongPtr(hWnd,GWL_STYLE,style); //新しいウィンドウスタイルを設定 としたらボタンのサイズ変更は出来なくなるのですが、 サイズ変更境界が表示されたままになります。 その状態でウィンドウを最小化、元に戻すとするとサイズ変更境界だけ消えたような変な形のボタンになります。 これがどうしてもいやなのです。 原因もわかりません。 対処法を教えてもらえないでしょうか? 環境はBorlandです。

みんなの回答

  • FAY
  • ベストアンサー率49% (95/193)
回答No.3

style &= ~WS_THICKFRAME; style &= ~WS_BORDER; としてスタイルを設定した後、InvalidateRect()などで 更新してあげましょう。サイズ変更枠が消えます。 ボタンの大きさをサイズ変更枠の外側に合わせたい場合は GetSystemMetrics()でサイズ変更枠の幅と高さを取得して その分だけMoveWindow()でボタンサイズを大きくしてあげる必要があります。

Missing0001
質問者

お礼

ありがとうございます。 一度試してみます。

  • FAY
  • ベストアンサー率49% (95/193)
回答No.2

>サイズ変更境界だけ消えたような変な形のボタンになります というのは外側の枠が細線になったボタンのことですか? >これがどうしてもいやなのです どういう形にしたいのでしょうか。

Missing0001
質問者

補足

>どういう形にしたいのでしょうか。 最初が WS_BORDER | WS_CHILD | WS_VISIBLE | WS_THICKFRAME という状態だったので、 WS_THICKFRAMEを抜いた WS_BORDER | WS_CHILD | WS_VISIBLE の状態の見た目にしたいのです。 お願いします。

  • FAY
  • ベストアンサー率49% (95/193)
回答No.1

>style ^= WS_THICKFRAME style &= ~WS_THICKFRAME では?

Missing0001
質問者

補足

すみません、現象がかわりません。 あと気になっているので質問させてください。 この現象が起きるのは自分の関数の使い方が間違っているからとかではないですよね? みなさんの環境でも起きますよね?

関連するQ&A

  • CreateWindowEx のウィンドウスタイルが反映されないのですが・・・

    CreateWindowEx のウィンドウスタイルが反映されないのですが・・・ VC++6.0 の SDK にて、ウィンドウを表示するプログラムを作成中なのですが、 スタイルが思うように反映されません。なぜなのでしょうか。 hList = CreateWindowEx( 0,      WC_LISTVIEW, "",       WS_CHILD | WS_VISIBLE |//猫でもわかる ~ によるうとデフォルトで必要らしい      WS_EX_CLIENTEDGE |   // 縁が沈んで見える境界線を持ちます。→ 持ちません      WS_EX_ACCEPTFILES |  // ドラッグ&ドロップを受けるとあるが、テキストをドロップしても×マーク      WS_EX_RIGHTSCROLLBAR | // 右スクロールバーが出るはずなのに・・・      LVS_REPORT,       // カラムのタイトル      0, 0, 0, 0,      hWnd,      (HMENU)LISTVW_HI_1,      hInst,      NULL);

  • ウィンドウのサイズ変更について

    ウィンドウのサイズ変更について質問です。 ウィンドウをサイズ変更する際に、マウスで指定数動いた時だけ サイズ変更するようにしたいのですが、何か方法はあるのでしょうか? ちなみに、 拡張ウィンドウスタイルは、 WS_EX_TOOLWINDOW | WS_EX_LAYERED | WS_EX_ACCEPTFILES ウィンドウスタイルは、 WS_POPUPWINDOW | WS_CLIPCHILDREN です。 「WS_THICKFRAME」を使用してやろうとしたのですが出来ませんでした。 何か方法があるのかもしれませんが。 開発環境 XP Visual Studio 2005 C、C++でWindowsAPIを使用しています。

  • ボタンのスタイル変更

    ボタン1にフォーカスがある時、 BS_DEFPUSHBUTTONのスタイルになり、 Enterキーが使えますよね? ここからTabキーを押下すると、 ボタン1では、フォーカスがないので、 Enterキーはつかえません。 ということは、この時は、BS_DEFPUSHBUTTONのスタイルではない? 自分で、BS_DEFPUSHBUTTONのスタイルのON/OFFを行うには、 どの様にしたら良いでしょうか? SetWindowLong(GetDlgItem(hWnd, GWL_ID), GWL_EXSTYLE, BS_DEFPUSHBUTTON); と書いて、ONの処理は出来た?(太い境界線があるので)のですが、 スタイルOFFとするときの処理がわかりません。 環境は、Win98&SDK&VC6.0で作成してます。

  • ウインドウの移動禁止

    最大化したウインドウをタイトルバーでドラッグして移動させるのを禁止したいのですが、うまくいきません!どなたかご教授下さい。 現在 1.OnInitDialog()内  ・ウインドウを最大化   this->ShowWindow(SW_SHOWMAXIMIZED);  ・最大化,最小化ボタン消去、サイズ変更禁止   lStyle = GetWindowLong( this->m_hWnd, GWL_STYLE );   lStyle &= ~WS_MINIMIZEBOX;   lStyle &= ~WS_MAXIMIZEBOX;   lStyle &= ~WS_SIZEBOX;   SetWindowLong( this->m_hWnd, GWL_STYLE, lStyle ); 2.WindowProc()内  ・タイトルバーでのダブルクリックを無視   if( message == WM_NCLBUTTONDBLCLK ){     return TRUE;   } しかし、ウインドウをタイトルバーでドラッグして移動を禁止する事が出来ません。 何か方法は無いのでしょうか? 環境 WindowsXP Pro SP3 VC++6.0 SP6 以上、よろしくお願いします。

  • WindowsAPIの、ウインドウの表示非表示

    WindowsAPIのCreateWindowEx関数で作った 例えば第一引数が WS_EX_TOOLWINDOW|WS_EX_TOPMOST で第四引数が WS_SYSMENU | WS_VSCROLL | WS_SIZEBOX のウインドウを、何かのアクションがあったときいったん非表示にしてから、また何かのアクションがあった時に表示させるには、どのような物を使うのがベストなのでしょうか? プロシージャ内(HWNDはhw)で一例として(…?)試しに以下だけのものでやってみると long lStyle = GetWindowLong(hw, GWL_STYLE); lStyle = ~WS_VISIBLE; SetWindowLong(hw, GWL_STYLE, lStyle); 確かに非表示扱いにはなるようなのですが、これだけではスクリーンは再描画されず、再描画されるには人為的に別ウインドウを移動したりしないといけません。 おそらく「何かによって再描画させられれば」出来ると思うのですが それはどうすれば実現できるのでしょうか? また、これより もっと「こっちの方がいい」といった方法はありますでしょうか?

  • 突然ですが、DirectX9について質問させて頂きます。

    突然ですが、DirectX9について質問させて頂きます。 ウィンドウモードとフルスクリーンモードを切り替える プログラムを組んでいますが、なぜか、フルスクリーンモード からウィンドウモードに復帰すると画面サイズが変化してしまいます。 以下がその問題となる関数です。 void SetWindowStyle( HWND hWnd, bool g_WindowMode ) {     if( g_WindowMode )     {         SetWindowLong( hWnd, GWL_STYLE, WS_OVERLAPPEDWINDOW | WS_VISIBLE );         MoveWindow( hWnd, 0, 0, 0, 0, false );         SetClientSize( hWnd, WINDOW_WIDTH, WINDOW_HEIGHT ); // 以下に記載     }     else     {         SetWindowLong( hWnd, GWL_STYLE, WS_POPUP | WS_VISIBLE );         MoveWindow( hWnd, 0, 0, 800, 600, true );     } } 以下はウィンドウのサイズを再設定する関数です。 void SetClientSize( HWND hWnd, int width, int height ) {     RECT wnd_Rect, clt_Rect;     int WindowSize_Width, WindowSize_Height;     GetWindowRect( hWnd, &wnd_Rect );     GetClientRect( hWnd, &clt_Rect );     // ウィンドウのサイズを求める     WindowSize_Width = ( wnd_Rect.right - 1 ) - ( wnd_Rect.left - 1 );     WindowSize_Height = ( wnd_Rect.bottom - 1 ) - ( wnd_Rect.top - 1 );     // ウィンドウのサイズを変更     MoveWindow(    hWnd,             wnd_Rect.left,             wnd_Rect.top,             width + (WindowSize_Width-clt_Rect.right),             height + (WindowSize_Height-clt_Rect.bottom),             true     ); } SetClientSize関数はアプリ起動時に一度実行され、800x600に変更されます。 この時点では問題はありません。 しかし、フルスクリーンモード→ウィンドウモードと切り替えると、 800x576と値がおかしくなります。 結果的に800x600になる予定だったのですが…。 同じ関数を使用しているのに、なぜサイズが変化してしまうのでしょう? どなたかこの問題を解決する方法をご存知ないでしょうか? よろしくお願いします。

  • ダイアログボックスで指定したサイズどおり表示されない

    ダイアログボックスで指定したサイズがメイン上では約2倍の大きさになって表示されてしまい、困っています。 メニューリソースは以下のとおりです。 MYDLG DIALOG DISCARDABLE 25, 50, 100, 150 STYLE WS_VISIBLE | WS_CHILD | DS_CONTROL CAPTION "Dialog" FONT 9, "MS Pゴシック" BEGIN END WndProc内にダイアログを貼り付けています。 if(hDlgWnd) break; hDlgWnd = CreateDialog((HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE),"MYDLG",hWnd,DialogProc); それが実際にウィンドウを開くとダイアログがだいたいですが(50,115,200,340)のように表示されてしまいます。 VC++ Ver.6.0です。コンパイラ等の問題でしょうか。 ご存知の方、宜しくお願いします。

  • 最大化時のフルスクリーン

    いつもお世話になっております。 VS2005 を使ってWindowsアプリケーションの実装を行っています。 最大化時にフルスクリーンにしたくプログラムを作成しているのですが、 WndProc内で下記のプログラムを実行し、 最大化アイコンをクリックするとバグ?が起きてしまいます。 -------------------------------------------------- case WM_SIZE:   cxClient = LOWORD(lParam);   cyClient = HIWORD(lParam);   if(wParam == SIZE_MAXIMIZED){ //最大化されたら     ShowWindow(hWnd, SW_SHOWNORMAL); //(1)ウィンドウを元のサイズに戻す     //(2)アプリケーションのウィンドウのフレームを「なし」にする     GetWindowLong(hWnd, GWL_STYLE); //ウインドウ・スタイルの取得     SetWindowLong(hWnd, GWL_STYLE, WS_POPUP); //ウインドウ・スタイルの設定     SetWindowPos(hWnd, NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOZORDER);     ShowWindow(hWnd, SW_MAXIMIZE); //(3)ウィンドウ最大化   } return 0; -------------------------------------------------- 実行したアプリケーションの右上の最大化ボタンを押すと、 見た感じではif文の中を繰り返し行っているような・・・ 元のサイズに戻って最大化になってを数秒繰り返して 最後にペイントして停止します。(高速なため確かではありません) 上記プログラムをどう直したらよいのでしょう。 ご教授お願いいたします。

  • 1つのウィンドウに2つのエディット

    case WM_CREATE:  GetClientRect(hWnd, &rc);  EditL = CreateWindow(  TEXT("EDIT") , NULL ,  WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL |  ES_AUTOHSCROLL | ES_AUTOVSCROLL |  ES_LEFT | ES_MULTILINE ,  0 , 0 , rc.right / 2 , rc.bottom , hWnd , (HMENU)1 ,  ((LPCREATESTRUCT)(lParam))->hInstance , NULL);  EditR = CreateWindow(  TEXT("EDIT") , NULL ,  WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL |  ES_AUTOHSCROLL | ES_AUTOVSCROLL |  ES_LEFT | ES_MULTILINE ,  rc.left / 2 , 0 , rc.right , rc.bottom , hWnd , (HMENU)2 ,  ((LPCREATESTRUCT)(lParam))->hInstance , NULL);  return FALSE; とすると、1つのエディットしか表示されません。 また、 case WM_SIZE:  GetClientRect(edit, &rc); MoveWindow(edit, rc.left, rc.top, rc.right, rc.bottom, TRUE); として、ウィンドウサイズが変更された時に どちらのエディットもクライアント領域にあわせたつもりなのですが、 サイズ変更で左側のエディットがスクロールバーの幅の分だけ 縮小されてしまいます。 どこをどのように直したらよろしいのでしょうか? 宜しくお願いします。 #Win98 & VC++6.0 & SDK で作成しています。

  • ウィンドウのサイズ変更について

    タイトルバーがないウィンドウのサイズ変更について質問です。 タイトルバーがあるウィンドウでは、 ウィンドウの端にマウスカーソルを合わせると サイズ変更のカーソルに変わってサイズ変更が出来ますけど、 タイトルバーがないウィンドウでは出来ないのですが、 どうすればサイズ変更が出来るようになるのでしょうか? CreateWindowEx()には、 拡張ウィンドウスタイルには、 WS_EX_TOOLWINDOW | WS_EX_LAYERED | WS_EX_ACCEPTFILES ウィンドウスタイルには、 WS_POPUPWINDOW | WS_BORDER を渡しています。 開発環境 XP Visual Studio 2005 C、C++

専門家に質問してみよう