質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CMake

CMakeはクロスプラットフォームで作動するオープンソースのビルドシステムです。コマンドライン又は組み込まれた開発環境で使うことができる元のmakefileとプロジェクトファイルを生成します。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

GitHub

GitHubは、Gitバージョン管理システムを利用したソフトウェア開発向けの共有ウェブサービスです。GitHub商用プランおよびオープンソースプロジェクト向けの無料アカウントを提供しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

1991閲覧

Win32で自作のダイアログエディタで上下関係をはっきりしたい

katahiromz

総合スコア186

CMake

CMakeはクロスプラットフォームで作動するオープンソースのビルドシステムです。コマンドライン又は組み込まれた開発環境で使うことができる元のmakefileとプロジェクトファイルを生成します。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

GitHub

GitHubは、Gitバージョン管理システムを利用したソフトウェア開発向けの共有ウェブサービスです。GitHub商用プランおよびオープンソースプロジェクト向けの無料アカウントを提供しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2018/02/22 02:05

編集2018/02/22 02:06

こんにちは。

前提・実現したいこと

今、Win32 APIでRisohEditorという名前のリソースエディタを作っています。

RisohEditor
https://github.com/katahiromz/RisohEditor

そこで、「ダイアログの編集」のコントロールの上下関係がおかしいので修正したいと考えております。

発生している問題・エラーメッセージ

次の画像をご覧下さい。

イメージ説明

RisohEditorをビルドし、RisohEditorでRisohEditor.exe自身を開いて、ダイアログの編集を開いたところです。選択しているコントロールは、最前面になければいけませんが、実際は「参照(B)...」ボタンに隠れています。z-indexが大きい方が前面に表示されるようです。当たり判定もおかしく、z-indexが小さい方が優先されるようです。

該当のソースコード

src/MRadWindow.hppとsrc/MRubberBand.hppで実装しています。
https://github.com/katahiromz/RisohEditor/blob/master/src/MRadWindow.hpp
https://github.com/katahiromz/RisohEditor/blob/master/src/MRubberBand.hpp

補足情報

CMakeと、Visual C++かg++でビルドできます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

katahiromz

2018/02/22 09:38

SetWindowPos?HWND_TOPを使えばz-indexをゼロにできるのは、知っていますが、コントロールを逆順に描画させる方法が分かりません。
katahiromz

2018/02/22 11:55

当たり判定を改変する方法でも構いません。
guest

回答1

0

自己解決

次のように解決しました。

まず、当たり判定を次のように改変します。

c++

1 struct MYHITTEST 2 { 3 HWND hParent; 4 HWND hCandidate; 5 HWND hLast; 6 POINT pt; 7 }; 8 9 static BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam) 10 { 11 MYHITTEST *pmht = (MYHITTEST *)lParam; 12 RECT rc; 13 GetWindowRect(hwnd, &rc); 14 if (PtInRect(&rc, pmht->pt)) 15 { 16 // NOTE: EnumChildWindows scans not only children but descendants. 17 if (MRadCtrl *pCtrl = MRadCtrl::GetRadCtrl(hwnd)) 18 { 19 if (pCtrl->m_bTopCtrl) 20 { 21 pmht->hLast = hwnd; 22 if (!IsGroupBox(hwnd)) 23 { 24 pmht->hCandidate = hwnd; 25 } 26 } 27 } 28 } 29 return TRUE; 30 } 31 32 UINT OnNCHitTest(HWND hwnd, int x, int y) 33 { 34 if (m_bTopCtrl) 35 { 36 RECT rc; 37 GetWindowRect(hwnd, &rc); 38 39 POINT pt = { x, y }; 40 if (m_hwndRubberBand && PtInRect(&rc, pt)) 41 return HTCAPTION; 42 43 MYHITTEST mht; 44 mht.hParent = GetParent(hwnd); 45 mht.hCandidate = NULL; 46 mht.hLast = NULL; 47 mht.pt = pt; 48 EnumChildWindows(mht.hParent, EnumChildProc, (LPARAM)&mht); 49 50 if (mht.hCandidate == hwnd || 51 (!mht.hCandidate && mht.hLast == hwnd)) 52 { 53 return HTCAPTION; 54 } 55 } 56 return HTTRANSPARENT; 57 }

次に、MRubberBand::CreateDxの呼び出しの直後に、次のようなコードを追記します。

c++

1 if (!MRadCtrl::IsGroupBox(hwnd)) 2 { 3 SetWindowPosDx(hwnd, NULL, NULL, HWND_BOTTOM); 4 }

これで上下関係はバッチリいけました。皆様、ありがとうございました。

投稿2018/02/23 12:47

katahiromz

総合スコア186

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問