CEdit などのコントロールを任意のデバイスコンテキストに配置することはできるのでしょうか?
Visual studio C++です。
キーワードが悪いのかなかなか見つかりません。
何をしたいのかというと、画像をマウスで拡大縮小できるようにしたのですが、そこにテキストボックスを表示させたくて、しかも、入力できて、画面同様に拡大縮小もさせたかったのです。
イメージとしてはExcelのテキストボックスのような、動かせる入力テキストボックスを作成する感じです。
それで、すでに拡大縮小できている画像の上に描画すればできるのではないかと思いまして。
「描画」という単語は、プログラミング用語的には「絵を描く」ことを示します。マウスやキーボードの入力に関することや、それによって処理できる機能、プログラム上のデータオブジェクトとのデータ交換などは、「描画」には含まれません。
質問者様がやりたいことは、コントロールを「描画」することではなく、ウィンドウ上のある特定の場所にコントロールを動的に「配置」することなのではないでしょうか。
やりたいことが「配置」ではないのであれば、もう少し質問の文章でやりたいことを補足すると、回答が付きやすいのではないかと思います。
> 任意のデバイスコンテキストに
という記述になってることから,やりたいことはまさに「描画(だけ)」なのだろうと思うけど,
もう少し話の補足があった方が良さそうだというのは同意.
アドバイスありがとうございます。
やりたいことは描画じゃなくて配置でした。
もう少し整理して追記させていただきます
「デバイスコンテキスト」は、確かに描画のためのものであって、コントロールそのものの配置に直接影響したりはしません。ただし、コントロールの描画には影響します。
https://docs.microsoft.com/ja-jp/cpp/mfc/device-contexts?view=msvc-170
「デバイスコンテキストは、ディスプレイやプリンターなどのデバイスの描画属性に関する情報を含む Windows データ構造体です。」
Windowsの内部においては、コントロールは"ウィンドウオブジェクト"の一種です。対象のコントロールを子ウィンドウとして生成することで、親ウィンドウ上に配置できます。Microsoft docsのCreateWindowExW()の引数説明におけるhWndParentを参照してください。
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-createwindowexw
とてもご面倒に感じるでしょうが、Windowsプログラミングをイチから学習したほうが、結局は最短距離であると思います。猫プラのWindows SDK編をお勧めしておきます。
http://www.kumei.ne.jp/c_lang/index_sdk.html
「配置」の話だった! これは感服.
---
「任意の」とか書かれると,読み手は
「自分のプログラムで作ってるウィンドウの上にエディットボックスを追加したい」みたいな単純な話なのか否か…?
とかなるので,「任意」が指す範囲を明確に述べると良いかも.
ありがとうございます。
おっしゃる通り、いまいち理解が足りていいない感じがします。
SDK編読んでみます!
何をしたかったというと、まずアプリ内の画像をマウスで拡大縮小できるようにしたのですが、そこにテキストボックスを表示させたくて、しかも、入力できて、画面同様に拡大縮小もさせたかったのです。
イメージとしてはExcelのテキストボックスのような、動かせる入力テキストボックスを作成する感じです。
それで、すでに拡大縮小できている画像の上に描画すればできるのではないかと愚考した次第です。
もうCEditはCEditで拡大縮小するしかないかなと思っております・・・
GUIも拡大縮小する…
一度等倍で描画した結果をキャプチャしてそれを拡大縮小して表示…みたいな方向性は無いのでしょうか?
画像を拡大縮小したとき、テキストボックス自体も大きさやフォントが拡大縮小することを期待していますか?
それとも、画像のある座標に連動してテキストボックスが移動することだけを期待していますか?
> CEditはCEditで拡大縮小するしかないかなと思っております
をからはエディットボックス自体の大きさも変化させたいように読めますが、念のため確認します。
はい、そうです、エディットボックス自体のサイズも拡大縮小で変化させたいのです。
Excelのテキストボックスのように。
CWnd::SetWindowPos()を使うと、ウィンドウの位置と大きさを一度に変更できます。コントロールのZオーダーもSetWindowPos()で調整できますので、必要に応じて調整すればよいでしょう。
エディットボックスを拡大縮小したときにフォントの大きさも変更したい場合は、CWnd::SetFont()を使います。
画像の拡縮は、自前でマウスイベントのハンドラ内で実装していますか?そうであればそのマウスイベントハンドラ内に上記をうまいこと追加すればよいでしょう。そうではなくて外部コンポーネントを利用されている場合は、そちらのマニュアルを読むなりベンダーに問い合わせる必要があります。
MFCはしんどいですね。。。
ありがとうございます。
かなり難しいということが分かったので 助かりました。
とりあえず,自分でできる技術内でやってみます。
回答1件
あなたの回答
tips
プレビュー