>>932 どうでもいいがWM_KEYDOWNで使うならGetKeyStateの方が普通。
>>936 サンクス、調べてみます。
WM_KEYDOWNだと、日本語キーボードで ';' ':'がたいてい別キーなのに、
VKコードが同じだったり使いづらいので、WM_CHARと併せて2回判定する必要が
ありそうだったので、困ってました。
939 :
デフォルトの名無しさん:02/03/24 02:54
Windows2000の環境で多国語を表示するにはどうすればいいのでしょうか?
CreateFontW に DEFAULT_CHARSETを設定してもだめだし、
どのようなパラメータでフォントを作成すればいいのでしょうか?
特に考えなくても表示できると思いますが。
フォントとか色々インストールしてますか?
*.rcで作った、ダイアログに付けたメニューに、アクセラレータキーを
設定する方法を教えてください。
メニューと同じ名前のアクセラレータを作っただけでは働かず、
WM_INITDIALOGで LoadAccelerators(hInst, "samplemenu");
って感じにやっても働きませんでした。
アクセラレータキーってLoadAcceleratorsでロードしただけじゃダメなのよん。
TranslateAcceleratorやらなきゃ。
問題は、これをどこでやるかだ・・・
うーん…色々やってみましたが、よくわからんです。
「メッセージループしてるところで捕らえる」、ってのは解ったのですが
DialogBox(...) でダイアログを作ってるので、何処がメッセージループに
なってるのかが解りません。
CreateDialog(...)に書き直すのは問題ないのですが、書き直さないで
実現できる方法は無いでしょうか?
>>943 CreateDialogBoxで作って、自分でメッセージループを回す
>>943 モーダルダイアログボックスは、メッセージループを自分で回してしまうので
無理。モーダレスダイアログボックスでモーダルダイアログボックスをエミュ
レートしましょう。MFC 使ってもいいけど。
947 :
デフォルトの名無しさん:02/03/24 21:17
2000以降では使えて、NT4.0で使えないAPI関数がコード上にある場合、
バイナリは分けるしかないでしょうか?
同じバイナリにすると、OSによって読み込むdllファイルを動的にかえるってことを
しなければならないとおもうのですが、そんなことが果たして可能なのでしょうか?
バージョン差を吸収するラッパー関数を作ればよろし。
>>947 > OSによって読み込むdllファイルを動的にかえる
LoadLibrary() 使いましょう。
>>948 でもラッパー関数ないでそのAPIを呼んだら同じことなんでは?
>>949 なるほど。
でもよく考えたら、やっぱりNTにないAPI関数がコードにある時点でだめなような
気がしてきました・・・
>>950 NTにないAPI関数をコードから取り除くためにLoadLibrary()を使うんだよ
GetVersionEx()を使って場合分けすれ
>>951 そうだったんですか・・・
わかりました。ちょっとMSDN逝って来ます。
大体わかりました。
おおざっぱなところでは、
if(version = WIN2000)
{
HINSTANCE hLib = LoadLibrary("aaa.dll");
if(hLib)
{
FARPROC fp2000API = GetProcAddress(hLib, "only2000Func");
if(fp2000API )
{
(*fp2000API)();
}
}
}
てなところでしょうか?
実は2つほど疑問があります。
疑問1: LoadLibraryで指定するライブラリはどう取得するのか?
# 今ところNTで実行するときにでてくるエラーダイアログからしかわからん(w
疑問2: 上記ロジックでやれば、ひょっとしてOSでの場合分けはいらないのでは?
# if(fp2000API)があるからなんですが。
a1-1 決めうち
a1-2 FindFirstなどで検索(一般のプラグイン実装とおなじやね)
a2 yes
>>955 どうもです。
>a1-1 決めうち
> a1-2 FindFirstなどで検索(一般のプラグイン実装とおなじやね)
なるほど。FindFirstFileでdllを探しにいうということですよね?
dllがなかったらあきらめると。
> a2 yes
ですよね。ありがとうございます。
関数ポインタの引数渡しで少し苦しんだけど、dllで決めうちで目的の物がつくれました。
ありがとうございました。
>>954 同名の別仕様関数が隠しAPIなどで他のOS上に実装されて
いないことが保証されているなら場合分けの必要はないが
OSごとに処理ルーチンが異なるんだったら普通しとくもんだろ
DCに文字列表示するときの実際のドットの幅を返してくれるAPIってありますか?
文字列とデバイスコンテキストを渡してやると幅を返すような奴。
MSDNのテキストのとこには見つからなかったもので。
ある。
見つけました
GetTabbedTextExtent
でOK.ですね。
>>960 探し方が足りませんでした〜
1000だろ、1000
964 :
デフォルトの名無しさん:02/03/28 22:06
SendMessage(hWnd, WM_PAINT, 0, 0);
が
UpdateWindow(hWnd);
より優れている点はありますか?
SendMessageでWM_PAINTを送るメリットを何一つ感じません。
966 :
デフォルトの名無しさん:02/03/28 22:30
>965
そんなことって何?
>964
wParamとlParamが0じゃイカンだろ(違
自分で勝手にWM_PAINTを送りつけても、クリッピング領域とか管理してないから
まともに再描画はされないぞ。メリットとか言う以前に仕様違反。
WM_PAINT
A window receives this message through its WindowProc function.
LRESULT CALLBACK WindowProc(
HWND hwnd, // handle to window
UINT uMsg, // WM_PAINT
WPARAM wParam, // not used
LPARAM lParam // not used
);
Parameters
wParam
This parameter is not used.
lParam
This parameter is not used.
だけど、確かwParamはたしかHDCを指してたような
The WM_PAINT message is generated by the system and 『should not be
sent by an application』. To force a window to draw into a specific
device context, use the WM_PRINT or WM_PRINTCLIENT message.
>だけど、確かwParamはたしかHDCを指してたような
For some common controls, the default WM_PAINT message processing
checks the wParam parameter. If wParam is non-NULL, the control
assumes that the value is an HDC and paints using that device context.
970 :
デフォルトの名無しさん:02/04/17 23:24
質問です。
ダブルクリックの時間はどうやって取得しますか?
二回目のクリックで、WM_LBUTTONDBLCLKが送られなくなるまでの時間。
ダブルクリック動作を手動で実装しなければいけなくなったので。
標準コントロールは、SendMessageでWM_PAINTが送られると、画面じゃなくWPARAMに描画してくれます。
標準じゃないクラスの窓は、作者の実装次第。
WPARAMがゼロじゃない時はBeginPaint〜EndPaintを呼ばずにWPARAMを使う癖をつけてもいいかも。
サンクスです。うわ、そのまんまな名前ですね
974 :
デフォルトの名無しさん:02/04/18 06:33
質問です。
最近のソフトによくあるアイコン付きのメニュー(Officeとかみたいの)
はAPIではどうやって作るんでしょう?
API Onlyといういみなら、オーナードローでゴリゴリ書け、としか。
ライブラリのソースを読めばいい。
977 :
デフォルトの名無しさん:02/05/09 22:19
ちょっと、教えてくれ!
「Shift + Home」をAPIで押した状態にしたい。
その場合、どうすれば良いか?
ただし、keybd_event等はKey_Down等のイベントが起きるので
使いたくない!!
できれば、SendMessage(PostMessage)等が理想。
次スレへどうぞ。
u
u
u
u
u
u
u
u