powerpoint のようなテキストボックス

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
なおゆき
記事: 4
登録日時: 2007年4月09日(月) 20:29

powerpoint のようなテキストボックス

#1 投稿記事 by なおゆき »

現在グラフを描画するプログラムを作成中なのですが、powerpointのように画面上にテキストボックスを自由に配置できて、可逆的にテキストを編集できるような機能を追加したいと考えています。しかし、どのようにすればその機能が実現できるのか見当がつきません。リッチエディットテキストボックスで実現できるものでしょうか?
教えていただけると幸いです。よろしくお願いします。
konisi
記事: 893
登録日時: 2005年7月25日(月) 13:27
お住まい: 埼玉県東松山市
連絡する:

#2 投稿記事 by konisi »

powerpointを使った事がない上に、「可逆的に~編集」あたりの意味が分かりませんが、CreateWindowExを使えばエディットボックスを自由に配置できると思います。
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。

に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
なおゆき
記事: 4
登録日時: 2007年4月09日(月) 20:29

#3 投稿記事 by なおゆき »

返信ありがとうございます。
説明がわかりにくかったようで、すみません。
私が想定している機能は、PowerPoint や Word のようにソフトの使用者が自由にテキストボックスを作成してドラッグ移動でき、かつテキストの内容を好きなときに再編集できるようなものです。年賀状の作成ソフトなどにも同じ機能があります。
非常にあいまいな質問で申し訳ないのですが、このようなテキストボックスの実現方法(使用するコントロール、APIなど)があれば教えていただけるとうれしいです。
MML
記事: 154
登録日時: 2006年5月02日(火) 16:27

#4 投稿記事 by MML »

> 返信ありがとうございます。
> 説明がわかりにくかったようで、すみません。
> 私が想定している機能は、PowerPoint や Word のようにソフトの使用者が自由にテキストボックスを作成してドラッグ移動でき、かつテキストの内容を好きなときに再編集できるようなものです。年賀状の作成ソフトなどにも同じ機能があります。
> 非常にあいまいな質問で申し訳ないのですが、このようなテキストボックスの実現方法(使用するコントロール、APIなど)があれば教えていただけるとうれしいです。
なんとなくわかります。
「トラック」(四角形の枠を自由にうごかせれるやつ)を作って、
それにテキストボックスなんかをやっていけばいいと思います。
なんか説明がわからなかったらすいません。
exx
記事: 2
登録日時: 2007年4月13日(金) 21:54

#5 投稿記事 by exx »

> 私が想定している機能は、PowerPoint や Word のようにソフトの使用者が自由にテキストボックスを作成して
> ドラッグ移動でき、かつテキストの内容を好きなときに再編集できるようなものです。

これはCreateWindowEXで作成した後、そのテキストボックスそのものをドラッグ移動させるという事ですか?
ドラッグ移動に関してなら下の例のようなやり方があります。もしかしたら利用できるかも知れません。
テキストの内容の再編集にはその内容をコピーしてから座標の計算もして描画するとか。
ただ、そのような市販ソフトレベルの高機能をそのまま実現したいのならAPIの組み合わせだけでは簡単にいかない感じがします。

コード: 全て選択


'EditBox1をドラッグ移動させる簡単な例(この例ではウィンドウにEditBox1がすでにRAD上で作ってあるとします
'CreateWindowEXでEditを作成した場合は作成した方のハンドルを使ってください)
Dim EditCallBackhWnd As Long
const DRAGMOVE = &HF012

Function EditWndProc(hWnd As Long,uMsg As Long,wParam As Long,lParam As Long) As Long
	Select Case uMsg
		Case WM_LBUTTONDOWN
			ReleaseCapture()
			SendMessage(GetDlgItem(hMainWnd,EditBox1),WM_SYSCOMMAND,DRAGMOVE,0)
			EditWndProc=0
		Case Else
			EditWndProc=CallWindowProc(EditCallBackhWnd As VoidPtr,hWnd As HWND,uMsg,wParam,lParam)
	End Select
End Function

'メインウインドウのWM_CREATEでサブクラス化を設定
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
	EditCallBackhWnd = SetWindowLong(GetDlgItem(hMainWnd,EditBox1),GWL_WNDPROC,AddressOf(EditWndProc) As Long)
End Sub


なおゆき
記事: 4
登録日時: 2007年4月09日(月) 20:29

#6 投稿記事 by なおゆき »

返事がおそくなってしまいすみません。ゆちボンさん、exxさん、返信ありがとうございます。

この数日、自分でもネットで検索してみたのですが、”トラック”については情報が見当たりませんでした。しかし、四角い枠というのは自分が想定しているものと近そうです。四角い枠の角にサイズ変更のための取っ手(?)があるようなものができればいいと思っています。もし詳しい情報があれば知りたいです。
それと、テキストボックスをドラッグ移動させるサンプルコードは、非常に参考になりました。自分でも工夫してみる必要がありそうですね。
xss0423

要するに

#7 投稿記事 by xss0423 »

メインウィンドウにエディットボックスを貼り付けて以下のコードをメインウィンドウのWM_PAINTイベント内に書いて実行してみて下さい
周囲の黒枠と黒ポチはGDIで手書きしているだけです
Wordなんかのは専用のウィンドウクラスのウィンドウを作ってんのかも知れませんが
ABではこれが精一杯だと思います

これのリサイズとドラッグを実現するには、マウスカーソルがエディットボックスの境界付近によってる時におきたWM_RBUTTONDOWNをキャプチャすれば良いでしょう
境界付近かどうかの判断はGetWindowRectとGetCursorPosを使えば可能です

リサイズにしろドラッグにしろマウスが押された位置と離された位置の座標があれば処理は可能なはずです
xss0423

#8 投稿記事 by xss0423 »

失礼、貼るコードと場所を間違ってました
これをMainWndProcの中に貼ってください
exx
記事: 2
登録日時: 2007年4月13日(金) 21:54

#9 投稿記事 by exx »

ユーザーによるサイズ変更ですが、
APIにはWS_THICKFRAMEというサイズ変更境界のあるウインドウスタイルがもともと用意されてるので、
それをコントロールに設定するとかなり簡単に実現できます。(座標計算など他の方法もあります。)
Editに限らず他のコントロールも適用できるのでいろいろと応用して使えるのではないでしょうか。
無論、他の方法との組み合わせで使っていくのも良いかもしれません。

コード: 全て選択


'メインウインドウのWM_CREATEでEditBox1にWS_THICKFRAMEを設定している例です。(注:この場合、座標の計算や自前の描画の必要はありません)

Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
	Dim style As Long
	style = GetWindowLong(GetDlgItem(hMainWnd,EditBox1), GWL_STYLE) or WS_THICKFRAME
	SetWindowLong(GetDlgItem(hMainWnd,EditBox1), GWL_STYLE, style)
	SetWindowPos(GetDlgItem(hMainWnd,EditBox1),hMainWnd,0,0,0,0,SWP_NOZORDER or SWP_NOSIZE or SWP_NOMOVE or SWP_DRAWFRAME)
End Sub
なおゆき
記事: 4
登録日時: 2007年4月09日(月) 20:29

試行錯誤中...

#10 投稿記事 by なおゆき »

返信ありがとうございます。

>xss0423さん

まさにこのような外観のテキストボックスを作りたいと思っていました!
これをベースに、テキストボックスのサイズ変更やドラッグ移動の方法、テキストボックス非選択時の枠消去の方法を考えてみたいと思います。

>exxさん

サイズ変更が簡単にできるウィンドウスタイルがあるとは知りませんでした。これは便利そうですね。あと、枠を表示したり非表示にしたりする切り替えができるとうれしかったのですが・・・
返信する