トップページ⇒tech
986コメント329KB

Win32API【2】

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさんNGNG
スレ立てるまでもない、Win32APIのついての質問はこちらへどうぞ。
やさしいお兄さんたちが答えてくれるかも。
ただし、質問する前にまずMSDN読め。

MSDN Online
http://www.asia.microsoft.com/japan/developer/

前スレ
http://pc.2ch.net/test/read.cgi/tech/991576947/
0936デフォルトの名無しさんNGNG
>>935
アクセラレータテーブルは作れるよ。MSDN調べてみるといい。
0937デフォルトの名無しさんNGNG
>>932
どうでもいいがWM_KEYDOWNで使うならGetKeyStateの方が普通。
0938デフォルトの名無しさんNGNG
>>936
サンクス、調べてみます。
WM_KEYDOWNだと、日本語キーボードで ';' ':'がたいてい別キーなのに、
VKコードが同じだったり使いづらいので、WM_CHARと併せて2回判定する必要が
ありそうだったので、困ってました。
0939デフォルトの名無しさんNGNG
Windows2000の環境で多国語を表示するにはどうすればいいのでしょうか?
CreateFontW に DEFAULT_CHARSETを設定してもだめだし、
どのようなパラメータでフォントを作成すればいいのでしょうか?
0940デフォルトの名無しさんNGNG
特に考えなくても表示できると思いますが。
フォントとか色々インストールしてますか?
0941デフォルトの名無しさんNGNG
*.rcで作った、ダイアログに付けたメニューに、アクセラレータキーを
設定する方法を教えてください。
メニューと同じ名前のアクセラレータを作っただけでは働かず、
WM_INITDIALOGで LoadAccelerators(hInst, "samplemenu");
って感じにやっても働きませんでした。
0942デフォルトの名無しさんNGNG
アクセラレータキーってLoadAcceleratorsでロードしただけじゃダメなのよん。
TranslateAcceleratorやらなきゃ。
問題は、これをどこでやるかだ・・・
0943941NGNG
うーん…色々やってみましたが、よくわからんです。

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

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

>>949
なるほど。
でもよく考えたら、やっぱりNTにないAPI関数がコードにある時点でだめなような
気がしてきました・・・
0951デフォルトの名無しさんNGNG
>>950
NTにないAPI関数をコードから取り除くためにLoadLibrary()を使うんだよ
GetVersionEx()を使って場合分けすれ
0952947NGNG
>>951
そうだったんですか・・・
わかりました。ちょっとMSDN逝って来ます。
0953947NGNG
大体わかりました。
おおざっぱなところでは、

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

てなところでしょうか?

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

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

a2 yes
0956947NGNG
>>955 どうもです。

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

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

> a2 yes
ですよね。ありがとうございます。
0957947NGNG
関数ポインタの引数渡しで少し苦しんだけど、dllで決めうちで目的の物がつくれました。
ありがとうございました。
0958デフォルトの名無しさんNGNG
>>954
同名の別仕様関数が隠しAPIなどで他のOS上に実装されて
いないことが保証されているなら場合分けの必要はないが
OSごとに処理ルーチンが異なるんだったら普通しとくもんだろ
0959デフォルトの名無しさんNGNG
DCに文字列表示するときの実際のドットの幅を返してくれるAPIってありますか?
文字列とデバイスコンテキストを渡してやると幅を返すような奴。
MSDNのテキストのとこには見つからなかったもので。
0960デフォルトの名無しさんNGNG
ある。
0961959NGNG
見つけました
GetTabbedTextExtent
でOK.ですね。
>>960
探し方が足りませんでした〜
0962デフォルトの名無しさんNGNG
http://pc.2ch.net/test/read.cgi/tech/1017072275/
新スレ立てマスタ
09631000!NGNG
1000だろ、1000
0964デフォルトの名無しさんNGNG
SendMessage(hWnd, WM_PAINT, 0, 0);
が
UpdateWindow(hWnd);
より優れている点はありますか?
SendMessageでWM_PAINTを送るメリットを何一つ感じません。
0965デフォルトの名無しさんNGNG
>>964
なんでそんなことすんの?
0966デフォルトの名無しさんNGNG
>965
そんなことって何?
0967デフォルトの名無しさんNGNG
>964
wParamとlParamが0じゃイカンだろ(違
自分で勝手にWM_PAINTを送りつけても、クリッピング領域とか管理してないから
まともに再描画はされないぞ。メリットとか言う以前に仕様違反。
0968デフォルトの名無しさんNGNG
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を指してたような
0969WM_PAINTNGNG
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.
0970デフォルトの名無しさんNGNG
質問です。
ダブルクリックの時間はどうやって取得しますか?
二回目のクリックで、WM_LBUTTONDBLCLKが送られなくなるまでの時間。
ダブルクリック動作を手動で実装しなければいけなくなったので。
0971デフォルトの名無しさんNGNG
標準コントロールは、SendMessageでWM_PAINTが送られると、画面じゃなくWPARAMに描画してくれます。
標準じゃないクラスの窓は、作者の実装次第。
WPARAMがゼロじゃない時はBeginPaint〜EndPaintを呼ばずにWPARAMを使う癖をつけてもいいかも。
0972デフォルトの名無しさんNGNG
>>970
http://msdn.microsoft.com/library/en-us/winui/mousinpt_1qn9.asp
0973970NGNG
サンクスです。うわ、そのまんまな名前ですね
0974デフォルトの名無しさんNGNG
質問です。
最近のソフトによくあるアイコン付きのメニュー(Officeとかみたいの)
はAPIではどうやって作るんでしょう?
0975デフォルトの名無しさんNGNG
API Onlyといういみなら、オーナードローでゴリゴリ書け、としか。
0976デフォルトの名無しさんNGNG
ライブラリのソースを読めばいい。
0977デフォルトの名無しさんNGNG
ちょっと、教えてくれ!
「Shift + Home」をAPIで押した状態にしたい。
その場合、どうすれば良いか?

ただし、keybd_event等はKey_Down等のイベントが起きるので
使いたくない!!

できれば、SendMessage(PostMessage)等が理想。
0978デフォルトの名無しさんNGNG
次スレへどうぞ。
0979デフォルトの名無しさんNGNG
u 
0980デフォルトの名無しさんNGNG
u  
0981デフォルトの名無しさんNGNG
u   
0982デフォルトの名無しさんNGNG
u    
0983デフォルトの名無しさんNGNG
u      
0984デフォルトの名無しさんNGNG
u       
0985デフォルトの名無しさんNGNG
u        
0986デフォルトの名無しさんNGNG
u          
レス数が950を超えています。1000を超えると書き込みができなくなります。