1 :デフォルトの名無しさん:2012/08/04(土) 11:18:03.75
スレ立てるまでもない、Win32APIのついての質問はこちらへどうぞ。

■過去スレ
Win32API質問箱 Build109
http://toro.2ch.net/test/read.cgi/tech/1341153543/

■注意
・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。
・日本語版MSDN Online Libraryは不完全です。
 英語版( http://msdn.microsoft.com/en-us/library/ )の利用推奨。
・APIフックなど高度な事をしたい場合はできるだけAdvenced Windowsを読みましょう。
・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで

179 :デフォルトの名無しさん:2012/08/09(木) 23:06:04.99
CreateWindowExでRichEditをWS_HSCROLLとWS_VSCROLL無しで作成してウィンドウに貼り付けてサブクラス化しています(これを初期状態とします)
初期状態でRichEditにBOTHでShowScrollBarをすると両方表示されます(これをスクロールAとします)
初期状態でRichEditにSetScrollInfoをするとこれも両方表示されます(これをスクロールBとします)

スクロールAもスクロールBもWM_*SCROLLが飛んできます
という事はRichEditにデフォルトで付属してるスクロールバーを使用せず独自に実装する場合は
・WS_*SCROLLを指定する必要が無い(当たり前と思いますが)
・スクロールバーコントロールを作成してchildに指定する必要が無い
・ShowScrollBar or SetScrollInfoで表示だけはできる
という事で合ってますか?

この状態でやってみたのですが全然スクロールされません
同期されていないという意味ではなくてスクロール範囲に指定している所が動かないのです
case WM_*SCROLL:
SetScrollInfo
ScrollWindowEx
UpdateWindow
InvalidateRect
return 0;

やっぱりコントロール作成→Childとして貼り付けという工程が必要なんでしょうか

185 :デフォルトの名無しさん:2012/08/10(金) 01:08:48.30
スクロールA・スクロールB・スクロールバーコントロール全て同じ動作でした

case WM_*SCROLL:
SetScrollInfo
ScrollWindowEx
UpdateWindow
InvalidateRect
return 0;

1行ずつ実行して行くと正常にスクロールされるのですが
スクロールさせた直後にreturn or break(デフォルトプロシージャで処理)
しても元に戻ってしまいました
どうすればスクロールが元に戻らなくなりますか?

187 :デフォルトの名無しさん:2012/08/10(金) 01:17:24.77
>>185
SendMessageでスクロールの位置を記憶させておくメッセージを送る

201 :デフォルトの名無しさん:2012/08/10(金) 12:43:55.66
>>187
スクロールバーの位置は問題無いのですが
ScrollWindowExで右に1文字分画面をスクロールしたのが
また左に1文字分スクロールされて元に戻ってしまうんです

>>179,>>185

202 :デフォルトの名無しさん:2012/08/10(金) 13:01:00.13
>>201
だから一時的にスクロールしてるだけだから記憶させなけりゃ元に戻るのは当たり前だろ
回答の内容が理解できないほど基礎知識が不足してるなら質問するなよ
おちょくってんのかコイツ

207 :デフォルトの名無しさん:2012/08/10(金) 14:53:20.72
>>202
スクロールバーの位置を記憶させる事を言ってるのかと思いました
ScrollWindowExの後に画面の位置を記憶させないといけないという事は
スクロールされた時の動作はMoveWindowでRichEditの座標yが1文字分上に移動してbottomが1文字分増えて
上にはみ出した分を表示していないって事になるのですか?

>>179,>>185,>>201

211 :デフォルトの名無しさん:2012/08/10(金) 15:41:08.49
>>207
つまり動かしたスクロールバーが元に戻るわけではなく
元々動いてないように見えるってこと?

212 :デフォルトの名無しさん:2012/08/10(金) 15:47:13.13
>>211
はい、スクロールバーは動いたらうごいたままその位置へ止まるのですが
再描画するとスクロール範囲内がスクロールバーを押す前の状態に戻るんです

>>179,>>185,>>201.>>207

214 :デフォルトの名無しさん:2012/08/10(金) 16:01:25.42
>>212
ライブラリに変なもの使ってるとかはない?
どっかの個人が作ったようなマイナーなライブラリ使ってるとか

215 :デフォルトの名無しさん:2012/08/10(金) 16:07:39.95
>>214
使用しているのは全てVC++2010付属の物です
RichEditを使用する時にシステムフォルダのMsftEdit.dllをロードしています
CreateWindowEx時にはMSFTEDIT_CLASS(L"RICHEDIT50W")を指定しています

>>179,>>185,>>201.>>207,>>212

217 :デフォルトの名無しさん:2012/08/10(金) 16:17:01.81
>>215
レンダリングの時点で元に戻ってるのかな
スクロールしたあとどの時点で戻ってるのかは分かる?

218 :デフォルトの名無しさん:2012/08/10(金) 16:41:07.47
>>215
てかScrollWindowExの代わりに普通にマウスでスクロールさせてそこにUpdateWindowとInvalidateRectかけても元に戻るのか、その辺りどうなんだ

220 :デフォルトの名無しさん:2012/08/10(金) 16:49:06.18
>>217
サブクラス化したRichEditのプロシージャでunMessageを見てみました

RichEditにフォーカスがある状態でVScrollDown
0x0115 WM_VSCROLL
SetScrollInfo 再描画フラグ TRUE
ScrollWindowEx スクロールオプション 0
このタイミングでスクロールされる
UpdateWindow
InvalidateRect 消去するかどうかの状態 TRUE
return 0;

WM_VSCROLLがreturn0;した後
0x001f WM_CANCELMODE
0x0215 WM_CAPTURECHANGED
0x0008 WM_KILLFOCUS
0x0281 WM_IME_SETCONTEXT
0x0282 WM_IME_NOTIFY
0x000f WM_PAINT
0x0014 WM_ERASEBKGND
ここのタイミングで元に戻る
0x02a2 WM_NCMOUSELEAVE

というメッセージが来ていました

>>179,>>185,>>201.>>207,>>212,>>215

221 :デフォルトの名無しさん:2012/08/10(金) 16:54:53.95
>>218
すみません
「ScrollWindowExの代わりにマウスでスクロール」の部分がわからないので試せません
マウスメッセージを捕まえてScrollWindowExするものだと思っていました

>>179,>>185,>>201.>>207,>>212,>>215,>>220

222 :デフォルトの名無しさん:2012/08/10(金) 16:59:19.74
>>220
ルーチンがどっか間違ってるんだろうけど・・・
InvalidateRect外して、ウィンドウ動かしたりして再描画しても元に戻る?

223 :デフォルトの名無しさん:2012/08/10(金) 17:07:59.43
>>222
元に戻ってしまいます
サブクラスの中はWM_*SCROLLの2種類しか処理していません

>>179,>>185,>>201.>>207,>>212,>>215,>>220,>>221

224 :デフォルトの名無しさん:2012/08/10(金) 17:15:21.95
>>223
よく考えろ

そのウインドウを作成するときに足りてないスタイルがないか?

229 :デフォルトの名無しさん:2012/08/10(金) 18:12:47.75
>>223
おかしいのはプロシージャ周りじゃないと思うけど。
普通のメモ帳みたいなやつでそれ実装したことある?

230 :デフォルトの名無しさん:2012/08/10(金) 19:47:37.84
>>224
リッチエディットにWS_VSCROLL | WS_HSCROLLを指定した場合
・ページ内に収まる行数 or 文字数になるとスクロールの位置が0になってしまう
・ウィンドウサイズbottomが小さくなる時にキャレットが常にウィンドウの一番下にくるように移動される
今の所この2点が気になったので自前で実装してみようと思ったんです

>>229
ScrollWindowExでスクロールさせるのは今回が初めてです

>>179,>>185,>>201.>>207,>>212,>>215,>>220,>>221,>>223

231 :デフォルトの名無しさん:2012/08/10(金) 19:54:46.97
>>230
前にもどっかで似たような質問見たぞ
2chではなかったけど

縦と横のスクロールバーの処理が逆とかないよな?

232 :デフォルトの名無しさん:2012/08/10(金) 20:00:50.79
>>231
表示が元に戻る前はスクロール方向VとHの違いは無かったので大丈夫と思います

>>179,>>185,>>201.>>207,>>212,>>215,>>220,>>221,>>223,>>230

235 :デフォルトの名無しさん:2012/08/10(金) 20:21:39.89
>>232

スクロールの位置を-1にしてみな。

237 :デフォルトの名無しさん:2012/08/10(金) 20:28:53.92
ルーチン組んで1刻みでどうなるのとか見ない子なのかしら

239 :デフォルトの名無しさん:2012/08/10(金) 20:38:48.86
>>235
VScrollの下をクリックした時(SB_LINEDOWN)に表示は上にスクロールさせる
(バーの移動方向と表示の移動方向は反対)
って事ならそのようになっていました

>>237
>>220の事でしょうか
デバッガでWM_VSCROLL内のブレイクポイントで止めてから
プロシージャのreturnのブレイクポイントでメッセージを全て見た結果です

>>179,>>185,>>201.>>207,>>212,>>215,>>220,>>221,>>223,>>230,>>232

245 :デフォルトの名無しさん:2012/08/10(金) 21:18:08.92
>>239
気付いた?

248 :デフォルトの名無しさん:2012/08/10(金) 22:11:09.49
>>245
何にでしょうか

EM_LINESCROLLが使えそうだったのですが
今度はwParamに指定しても水平方向には移動してくれません
垂直方向には移動してくれるので引数は合ってるはずなんですがどうしてでしょうか

>>179,>>185,>>201.>>207,>>212,>>215,>>220,>>221,>>223,>>230,>>232,>>239

249 :デフォルトの名無しさん:2012/08/10(金) 22:37:28.09
>>248
気付いてないのか
>>211-235であんたがレス返した相手のレスの
最初の1文字だけを抜き出してつなげてみな

>>211 → つ
>>215 → ラ




266 :デフォルトの名無しさん:2012/08/11(土) 20:33:14.26
Linuxで一定時間おきにメモリの使用率を測定してグラフにしたいと考えています
どうしたらいいでしょうか

326 :デフォルトの名無しさん:2012/08/14(火) 15:37:39.36
ポインタの原理は理解できるんだけど、
ポインタ表現の統一性に苦しむ。

p++ってアドレスに加算するの分かるのだけど
*p++もアドレス値に加算

(*p)++がアドレスを介してオブジェクトに加算

優先を考えると*p++は* p++
(*p)++は*p ++ だとしても * p++の*は何を意味するのか

p++ と *p++の混同で困る。

344 :片山博文MZボット ◆0lBZNi.Q7evd :2012/08/14(火) 17:24:22.45
http://msdn.microsoft.com/ja-jp/library/xbb7wf8y(v=vs.80).aspx
「この値は、リッチ エディット コントロールがES_RIGHT または ES_CENTER
スタイルのどちらかを持っていると無視されます」

345 :片山博文MZボット ◆0lBZNi.Q7evd :2012/08/14(火) 17:27:39.31
でもこっちには、単に「無視される」と書いてある。
http://msdn.microsoft.com/en-us/library/windows/desktop/bb761615(v=vs.85).aspx
ということは、>>344が間違い。

348 :デフォルトの名無しさん:2012/08/14(火) 17:31:33.80
>>345
richedit wparamはゼロじゃないとダメって書いてますね

リッチエディットのスクロールを制御する場合どういう方法を取りますか?

350 :片山博文MZボット ◆0lBZNi.Q7evd :2012/08/14(火) 17:33:34.95
>>348 普通にSendMessageでWM_HSCROLL送れば?

370 :片山博文MZボット ◆0lBZNi.Q7evd :2012/08/14(火) 20:02:59.04
スクロール表示用にリッチエディット使うのやめたら?用途が違う。別のコントロールを使うべき。

372 :デフォルトの名無しさん:2012/08/14(火) 20:19:36.91
>>370
用途としてはリッチエディットの機能を使いたいんですけど(フォントの色変更タブインデント幅変更etc)
エディタデフォルトのスクロール動作の一部を無効にしたいんです

ですがScrollWindowを使用してもスクロール直後の再描画で元に戻ってしまうんです

エディタから自分で作るしかないんですかね?


381 :片山博文MZボット ◆0lBZNi.Q7evd :2012/08/14(火) 20:57:59.39
サブクラス化

485 :デフォルトの名無しさん:2012/08/18(土) 06:06:08.20
いじめられる奴には必ず原因がある
いじめられる奴が悪い

595 :デフォルトの名無しさん:2012/08/21(火) 19:10:54.36
質問お願いします。
ウィンドウサイズをあるサイズ以下にさせない制御をしています。
たとえば、最小のサイズを縦500、横500と決めて、それより大きいサイズは
自由に変更させますが、それ以下のサイズは変更させない制御です。
縦600、横500はOKで、縦400、横500はNG、といった感じです。

その処理はほぼ制御できますが、以下の場合に制御できません。
WIN7のAeroスナップの機能(?)で、サイズ変更するウィンドウの四隅をドラッグして
画面一番上(又は下)まで持って行き「縦方向最大化」状態で、横サイズを例で言えば
500以下にすると、変更できてしまいます。

WM_SIZINGを捕まえてWMSZ_BOTTOMRIGHTとかのメッセージで制御していますが、Aeroスナ
ップの機能(?)は、ほかのメッセージで制御する必要があるんでしょうか?

ご教授お願いします。


640 :デフォルトの名無しさん:2012/08/22(水) 22:28:38.17
レス研究報告(^u^)/
去年から的外れな屁理屈で絡んでくる人は大体同じ人達~。
そして絡んでくる人は仲間同士が多い。
はじめは反論が一杯来るからビックリしたけど、最近は何だ又おマエらかって感じ(^u^)
行き場のない歪んだ人間の吹き溜まりを今、私は目撃しているのかな? (笑

758 :デフォルトの名無しさん:2012/08/26(日) 14:24:49.53
Windows7のSnipping Toolの様な機能ってどうやって実装するんですか?
つまり、ユーザーにデスクトップの画面をドラッグさせて、その際に出来た矩形の枠
内の画像を、アプリケーションに取り込みたいです。

765 :758:2012/08/26(日) 14:58:53.49
このサイトのサンプルで分かりそうです。
http://homepage1.nifty.com/MADIA/vc/api/
凄いありがたいね。このサイト。

771 :デフォルトの名無しさん:2012/08/26(日) 15:25:51.14
マウスキャプチャ無くてもできるだろ

825 :デフォルトの名無しさん:2012/08/27(月) 23:30:23.54
これさ、わざと電波を装って、win32の知識共有を妨害しようとしているのかな?


860 :デフォルトの名無しさん:2012/08/30(木) 16:04:19.20
#define HANDLE_MSG(hwnd, message, fn) \
case (message): return HANDLE_##message((hwnd), (wParam), (lParam), (fn))

これって、実際にはどう展開されますの?
教えてくださいおながいします

870 :デフォルトの名無しさん:2012/08/30(木) 20:30:57.91
case (WM_CLOSE):
 return HANDLE_WM_CLOSE(hWnd, wParam, lParam, OnClose);

こんな感じで合ってますの?

879 :デフォルトの名無しさん:2012/08/31(金) 19:57:12.13
Vista以降ではCHMファイルの閲覧はブロックされるが、
CHMファイルのブロックを自動的に解除するにはどうすればいいか?


http://toro.2ch.net/test/read.cgi/tech/1344046683/l50/../人気ブログランキングへ