Win32API【2】

このエントリーをはてなブックマークに追加
>>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やらなきゃ。
問題は、これをどこでやるかだ・・・
943941:02/03/24 15:14
うーん…色々やってみましたが、よくわからんです。

「メッセージループしてるところで捕らえる」、ってのは解ったのですが
DialogBox(...) でダイアログを作ってるので、何処がメッセージループに
なってるのかが解りません。

CreateDialog(...)に書き直すのは問題ないのですが、書き直さないで
実現できる方法は無いでしょうか?
>>943
CreateDialogBoxで作って、自分でメッセージループを回す
>>943
モーダルダイアログボックスは、メッセージループを自分で回してしまうので
無理。モーダレスダイアログボックスでモーダルダイアログボックスをエミュ
レートしましょう。MFC 使ってもいいけど。
946941:02/03/24 21:01
>>944-945
わかりました。ありがとうございます。
947デフォルトの名無しさん:02/03/24 21:17
2000以降では使えて、NT4.0で使えないAPI関数がコード上にある場合、
バイナリは分けるしかないでしょうか?
同じバイナリにすると、OSによって読み込むdllファイルを動的にかえるってことを
しなければならないとおもうのですが、そんなことが果たして可能なのでしょうか?
バージョン差を吸収するラッパー関数を作ればよろし。
>>947
> OSによって読み込むdllファイルを動的にかえる
LoadLibrary() 使いましょう。
950947:02/03/24 22:07
>>948
でもラッパー関数ないでそのAPIを呼んだら同じことなんでは?

>>949
なるほど。
でもよく考えたら、やっぱりNTにないAPI関数がコードにある時点でだめなような
気がしてきました・・・
>>950
NTにないAPI関数をコードから取り除くためにLoadLibrary()を使うんだよ
GetVersionEx()を使って場合分けすれ
952947:02/03/25 00:28
>>951
そうだったんですか・・・
わかりました。ちょっとMSDN逝って来ます。
953947:02/03/25 00:55
大体わかりました。
おおざっぱなところでは、

if(version = WIN2000)
{
 HINSTANCE hLib = LoadLibrary("aaa.dll");
 if(hLib)
 {
  FARPROC fp2000API = GetProcAddress(hLib, "only2000Func");
  if(fp2000API )
  {
    (*fp2000API)();
  }
 }
}

てなところでしょうか?

実は2つほど疑問があります。
954947:02/03/25 01:01
疑問1: LoadLibraryで指定するライブラリはどう取得するのか?
 # 今ところNTで実行するときにでてくるエラーダイアログからしかわからん(w

疑問2: 上記ロジックでやれば、ひょっとしてOSでの場合分けはいらないのでは?
 # if(fp2000API)があるからなんですが。
a1-1 決めうち
a1-2 FindFirstなどで検索(一般のプラグイン実装とおなじやね)

a2 yes
956947:02/03/25 01:31
>>955 どうもです。

>a1-1 決めうち
> a1-2 FindFirstなどで検索(一般のプラグイン実装とおなじやね)

なるほど。FindFirstFileでdllを探しにいうということですよね?
dllがなかったらあきらめると。

> a2 yes
ですよね。ありがとうございます。
957947:02/03/25 02:02
関数ポインタの引数渡しで少し苦しんだけど、dllで決めうちで目的の物がつくれました。
ありがとうございました。
>>954
同名の別仕様関数が隠しAPIなどで他のOS上に実装されて
いないことが保証されているなら場合分けの必要はないが
OSごとに処理ルーチンが異なるんだったら普通しとくもんだろ
DCに文字列表示するときの実際のドットの幅を返してくれるAPIってありますか?
文字列とデバイスコンテキストを渡してやると幅を返すような奴。
MSDNのテキストのとこには見つからなかったもので。
ある。
961959:02/03/25 19:22
見つけました
GetTabbedTextExtent
でOK.ですね。
>>960
探し方が足りませんでした〜
9631000!:02/03/28 19:12
1000だろ、1000
964デフォルトの名無しさん:02/03/28 22:06
SendMessage(hWnd, WM_PAINT, 0, 0);

UpdateWindow(hWnd);
より優れている点はありますか?
SendMessageでWM_PAINTを送るメリットを何一つ感じません。
>>964
なんでそんなことすんの?
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を指してたような
969WM_PAINT:02/03/29 18:04
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を使う癖をつけてもいいかも。
973970:02/04/18 00:25
サンクスです。うわ、そのまんまな名前ですね
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