トップページ⇒tech
1001コメント295KB

Win32API質問箱 Build18

■ このスレッドは過去ログ倉庫に格納されています
0001 ◆Manna2uCLg NGNG
スレ立てるまでもない、Win32APIについての質問はこちらへどうぞ。
やさしいオジサマ達が、熱く暑く答えてくれよう。
でも最低限、最新スレくらいは質問する前に検索を。
過去スレ・参考は>>2-5くらいを参照するッス!
0153デフォルトの名無しさんNGNG
>>152だとOSがどこの国で動いていてもシフトJISになるわけだが
それではまずい場合は
WideCharToMultiByte( CP_ACP, (以下略) );
まあMSDNを見れば一目瞭然なわけだが
0154デフォルトの名無しさんNGNG
>>139
まず、全ての標準コントロール (static を含む。NT系列では Comboを除く) は、CS_PARENTDC クラススタイルを
持っているので、描画は親ウィンドウのデバイスコンテキストにを用いて行われます。つまり描画について考える際には、
クリッピング領域とWM_PAINTの発行順だけを考慮すればOKです。デバイスコンテキストは共通だから。

次に、WS_CLIPSIBLINGS は単に全ての兄弟ウィンドウ(の矩形)への描画が行われないように描画範囲をクリップ
するって感じの属性で、Z-Orderは考慮されません。片方を他方の前に持ってきたからといって、前のほうが見える
ようになるわけではありません。

・・・具体的に何がしたいのかを書いてもらった方がもうちょっと実のある返事を書けるような気がする。
0155139NGNG
>>154

レスありがとうございます。理解した・・と思いましたが
できませんでした。

わかっていないのか・・_| ̄|○

具体的に作りたいのは自分が何問、何ページ、どの問題集を解いたかを
その日付ごとに教科単位で分けた子ウィンドウBに
(実際には構造体型配列に)記録しておけるプログラムです。

国数理社英
4/11□□□□□
4/13□□□□□
4/14□□□□□  □=子ウィンドウB

こんな感じになります。
この子ウィンドウBにはさらにプッシュボタンを持つ
ボタン子ウィンドウやらエディットやらがつまっています。
そしてもうひとつ、常にメインウィンドウの右下の最前面に存在し
スクロールバーをスクロールしても
メインウィンドウ上での位置を変化させない子ウィンドウAを作り
ここに正解確率やら、こなしたページの数やらを計算して
表示させたいのですが・・
この常に最前面に表示させるという方法がわかりません。
0156139NGNG
(続き)
WS_CLIPSIBLINGSを外してAにSetWindowPosのHWND_TOPMOSTを使うと
子ウィンドウAとBが重なっているときに
Aが前面に表示されているんですが
下にあるBのエディットに入力できたりしちゃうので
TOPMOSTは常に最前面に出してくれるんじゃなかったのか と
思う一方 自分は最善面という概念もわかっていないような
感じがします。

A、Bの両方にWS_CLIPSIBLINGSを設定して
AにSetWindowPosのHWND_TOPを使ったら
Aは前面に表示されているし重なったとき下のBを操作することも
できなかったので自分の思うようになったのですが
なぜこうなったのかわからないので生きた心地がしません。

長レス&超ド級初心者で申し訳ありません
助けてください_| ̄|○
0157デフォルトの名無しさんNGNG
>>155
http://www.topposystem.co.jp/DL/Win32API/GUI/%E3%83%9A%E3%82%A4%E3%83%B3%E3%83%88%E3%81%A8%E6%8F%8F%E7%94%BB%E3%81%AE%E6%A6%82%E8%A6%81.html
0158139NGNG
>>157
サンクス!!!
まだちょっとしかみてないけど
今の自分にぴったりかもしれません
見てみます
0159デフォルトの名無しさんNGNG
win32APIにてアイコンの変更ダイアログを呼び出したいんですが
ググってもvbに関しての情報がなくつまってます・・・

誰か助けてくだされ
0160159NGNG
事故解決でけますた
失礼
0161159NGNG
>>160
お前誰だよ!まだ解決してねーよ!!
0162159NGNG
>>161は偽物です。
0163デフォルトの名無しさんNGNG
つかそれはVBでWin32APIの使い方がわからないのか?ならVBスレで聞いてこい。
0164159NGNG
>>163
うるせー馬鹿
0165159NGNG
>>163
159&160は自分です。
使い方はもちろんのことわかっております。
検索しても情報が少なく、accessについてるやつ引っ張れそうなんで
"解決"判を押させてもらいました。

スレ汚しスマソ
0166デフォルトの名無しさんNGNG
>>165
どうやって解決した?
気になるじゃないか。
0167デフォルトの名無しさんNGNG
ならねーよ
0168159NGNG
なれよ。
0169デフォルトの名無しさんNGNG
この時間帯は何とも香ばしいですな。
質問があったけどまた後で来まつ。ノシ
0170159NGNG
>>166
解決といこうとしたんですが・・・
ちっと戦ってます。

ACCESSのSHChangeIconDialogに関して情報が載ってるソースあったんで
Shell32.dllから隠しでもってきて使ってみました。

したらばmsgboxが出てきて、文字化けたような
"ファイルxxxxxxxxがみつかりません。"と表示され
%SystemRoot%\system32\SHELL32.dll内のアイコンのリストビューがでます。

ンデ戦ってます。
0171デフォルトの名無しさんNGNG
Dim strBuff As String
strBuff = StrConv("c:\winnt\explorer.exe" & vbNullChar, vbUnicode)
Call SHChangeIconDialog(Me.hWnd, strBuff, 0, 0)

で行けたにょ(Win2K)。細かい部分は任せた。
0172159NGNG
>>171
vbUnicodeじゃなくてFORMのユニコ指定してた。
神サンクスですわー
0173デフォルトの名無しさんNGNG
簡単なWin32プログラムを作ってみたのですが、メッセージループでSleep()を入れないとCPU使用率が上がってフリーズしたような状態になってしまいます。
音楽が流れていると音が細切れになることから、これはリソースを独占して他のスレッドにリソースがうまく行き渡っていないからなのだと思うのですが、ここまでの解釈は合ってますよね?

で、うちのPCは常時CPU使用率が100%付近にきていて、しょっちゅうフリーズしてしまうという状況なのです。
これが上述の自分で作ったプログラムの症状と酷似している事から、どうやらメッセージループでリソースを独占している常駐ソフトがある、と睨んだところまではいいのですが
一通りのスタートアップ&サービスを止めてみたのですがだめぽでした。

こういうリソースを独占して他のアプリに迷惑をかける常駐ソフト(スレッド?)を見つける手段というのはあるのでしょうか?
また、クロック数の高いCPUに取り替えれば力押しでフリーズしないようになるのかどうか聞きたいのですが。

参考までに、ここの方と似たような症状です。
http://www21.ann.co.jp/pas/bbs6/lg115620.html
0174デフォルトの名無しさんNGNG
それプログラミングの質問か?
0175デフォルトの名無しさんNGNG
>>173
それ本気で知りたきゃ、実際に配布して試してもらえば?
0176173NGNG
>>174
やっぱスレ違い、というか板違いですか?
誘導してもらえるとありがたいのですが。

>>175
誰もが一番最初に作るであろうウィンドウだけの何もしないプログラムです。
0177デフォルトの名無しさんNGNG
>>176
おまえのPCだけがおかしいんじゃないのか
ウィンドウだけのプログラムでそんなことにはならない。
0178173NGNG
>>177
そうですね。どうもありがとうございました。
0179デフォルトの名無しさんNGNG
>>173

> こういうリソースを独占して他のアプリに迷惑をかける常駐ソフト(スレッド?)を見つける手段というのはあるのでしょうか?
タスクマネージャ

Windows Xp 質問スレ 86ページ目
http://pc5.2ch.net/test/read.cgi/win/1081622045/
0180デフォルトの名無しさんNGNG
>>176
メッセージループでGETMESSAGEだっけを使ってない。のかも??
PEEKMESSAGEのみだとそんな感じだったような気がする。
WHILEでCPUリソース食ってるとかそんなんじゃなかったかな??
あと、スペル間違ってるかも。
0181139NGNG
>>157

子ウィンドウ の項目までとりあえず読ませていただきました
まず クリップっていうのは
描画するにあたって関係のない領域を
描画する領域から排除するっていう感じでよろしいのでしょうか??

本文中に
"システムはクリッピング リージョン外の描画を廃棄 (クリップ) するため"
と一応しっかり書いてあるのですがちょっと自信がなくて・・

それで、

>兄弟ウィンドウは、 Z順序と逆の順番でWM_PAINTメッセージを受け取ります
>このため、 Z順序の最上位の (いちばん前の) ウィンドウは、
>最後にWM_PAINTメッセージを受け取ります。

つまりはZオーダーというものは描画処理の順番を決めることで
前後関係をうまく表現しているだけであるということなんでしょうか。

Zオーダーが下であるウィンドウからWM_PAINTは呼ばれ
を指定したウィンドウは描画する際に
兄弟ウィンドウの領域をクリップするなら
を指定した兄弟ウィンドウ同士が重なる場合は
Zオーダーと逆の順番で重ねられたカタチになるのかな・・
使い慣れない言葉に正確にイメージできてるかわからない概念で_| ̄|○
変な文章になってたらすいません。
再び おねがいします。

0182デフォルトの名無しさんNGNG
(リッチ)エディットコントロールについての質問なのですが、

上記をコンソールウィンドウのように、printfの代用としてメッセージ表示に用いているのですが、
僕自身がEM_REPLACESELを使用しているためか、表示処理がかなり遅く感じます。
(可能な限り、行単位で表示できるように処理してはいますが)

より速度を求める場合は、ウィンドウに直接書く(TextOut)しかないのでしょうか?
0183デフォルトの名無しさんNGNG
リッチエディットより ということなら普通のエディットでもいいだろ
0184デフォルトの名無しさんNGNG
前スレ見てて不思議に思ったんだが
> 464 名前:デフォルトの名無しさん[sage] 投稿日:04/03/10 21:12
> >>463
> みなさん大人しくfopen使ってるんすかねー?

> 466 名前:デフォルトの名無しさん[sage] 投稿日:04/03/10 21:30
> >>464
> 使ってる。ローカルファイルの一般的な展開にわざわざWin32APIを使うのは稀。
> MFCのCFile系統も必要なし。
> 将来の別プラットホームや別プロジェクトへの移植も考えると、C標準でほぼ十分。


って言ってるけど、結局fopenもW32APIコールに変換されてるんじゃない?と考えてReactOSのソースを見てみた。
msvcrt.dllのfopen.cから_open() (open.c内)が呼ばれ、そこではオープンモードを調査した上でこうしている
 hFile = CreateFileA(_path,
             dwDesiredAccess,
             dwShareMode,
             &sa,
             dwCreationDistribution,
             dwFlagsAndAttributes,
             NULL);

ROSのソースであってWindows自体のソースではないが、設計とAPIコール体系を調べた上で書いているようだから
参考にはなるだろう。
0185デフォルトの名無しさんNGNG
>>184
あのね。標準関数というのは、その環境でちゃんと動くように作られてるんだよ。
0186デフォルトの名無しさんNGNG
>>184
WindowsというかVCのCRTも最終的にはCreateFileを呼んでるけど。
fopenはCの規格に含まれる関数であって、OSのそれじゃない。
ネイティブで実装しているOSがあるかもしれないけど、それは今関係無い。

OSのサービスをC標準に準拠するようにラップするのが普通。
>>184みたいな事を言い出したら、mallocを使っていたとしても
いちいちHeapAlloc使ってますって言わなきゃならんのか?
0187デフォルトの名無しさんNGNG
なんか懐かしいなぁ。私も高校の頃はそんな風に思ったもんだよ。

話は逸れるが、fopen()のオープンモード拡張して排他制御できたらいいとはちょっと思う。
0188デフォルトの名無しさんNGNG
>>184
引用もとの発言者がしているのは、標準Cライブラリだけに依存している
プログラムはソースコードレベルで移植性があるよね、という話。
標準Cライブラリが動作する環境ならMakeかけなおすだけで大抵動く。
標準Cライブラリ自体は、あなたの言うとおりOSに依存するので移植性はない。
0189デフォルトの名無しさんNGNG
>>188
別に移植性云々じゃなくてたしかにCreateFileのほうがfopenより多機能だが、
大抵の状況では必要ないからfopenで十分だろ、って程度じゃないか?
0190デフォルトの名無しさんNGNG
>>189

183氏が

> 前スレ見てて不思議に思った

のは

> > 将来の別プラットホームや別プロジェクトへの移植も考えると、C標準でほぼ十分。

のくだりに関してだから、ここでいう移植とはこういう意味である、という
事でああいう風に書いた。
元発言の主旨はなにか、という話なら多分あなたの言う事が正しいのだろう。
0191デフォルトの名無しさんNGNG
他スレからのコピペだけど、
Visual C++ Toolkit 2003
http://www.microsoft.com/downloads/details.aspx?FamilyID=272be09d-40bb-49fd-9cb0-4bfa122fa91b&DisplayLang=en

http://msdn.microsoft.com/visualc/vctoolkit2003/

> What is the Visual C++ Toolkit 2003?
> The Visual C++ Toolkit is a free edition of Microsoft’s professional Visual C++
> optimizing compiler and standard libraries ? the same optimizing compiler and
> standard libraries that ship in Visual Studio .NET 2003 Professional!
キタ━━━━(゚∀゚)━━━━!!
さよなら某ランド
0192デフォルトの名無しさんNGNG
IDEあるの?
0193デフォルトの名無しさんNGNG
配布制限あり、IDEなし
まだまだ某は生きると思われ
0194デフォルトの名無しさんNGNG
どんな配布制限?
0195デフォルトの名無しさんNGNG
Are there any restrictions on how I use the Visual C++ Toolkit?

In general, no. You may use the Toolkit to build C++ -based applications,
and you may redistribute those applications. Please read the End User
License Agreement (EULA), included with the Toolkit, for complete details.

インストールせんとEULA読めんのか。
0196デフォルトの名無しさんNGNG
>>193はインストールして読んだんだろ?どんな制限があったのか教えてクリ。
0197デフォルトの名無しさんNGNG
NetBIOSでのワークグループ名やドメイン名を取得するAPIって何になるんでしょうか?
Windows 2000/XPについてです。

GetComputerObjectName かと思って試したんですが
ドメインに入っていないマシンだとERROR_CANT_ACCESS_DOMAIN_INFOという
エラーが出てしまいます。
0198デフォルトの名無しさんNGNG
>>191
コマンドラインベースだと某のコンパイラの方が使いやすい
0199デフォルトの名無しさんNGNG
商用アプリ不可、$5.0を超える手数料の徴収不可
0200デフォルトの名無しさんNGNG
えーご苦手ながら読んでみたけど、コンパイラはVC7.1(VS.NET2k3)のと同じなんだよね?
0201デフォルトの名無しさんNGNG
>>199
落として一通りEULAに目通してみたけど、
どこをどう読んだら「商用アプリ不可、$5.0を超える手数料の徴収不可 」になるんだ?
0202デフォルトの名無しさんNGNG
>199
少なくとも、$5.0の解釈は間違ってる。ライセンスの中で$5.00が出てくるのは、第15項だが
これは、terrariumのEULAにも出てくる。
http://www.microsoft.com/japan/msdn/net/terrarium/download/ter_eula.asp
http://www.microsoft.com/japan/msdn/net/terrarium/download/ter_eula_JP.asp

一番下の、LIMITATION OF LIABILITY AND REMEDIES. Notwithstanding any damagesがどーのこーのだ。
上記したterrariumの日本語参考訳の一番下を見ると判るが、「仮令、大きな被害を受け手も、5$以上は
俺ら(Microsoft)は支払いませんよ」という話で、手数料がどーのこーのという話ではない。
0203デフォルトの名無しさんNGNG
配布制限に関しても「このソフト(Visual C++ Toolkit 2003)を無断で転載したら駄目」って感じなんだけど・・・
ここはちょっと英語力に自信が無いから微妙だけど
0204デフォルトの名無しさんNGNG
英語の読めないアンチが騒いでるだけだから放置しとけ
0205デフォルトの名無しさんNGNG
プ
0206デフォルトの名無しさんNGNG
ピ
0207デフォルトの名無しさんNGNG
QueryPerformanceFrequency()でゼロが返される
ハードウェアが高分解能パフォーマンスカウンタをサポートしてない
PCってあるのでしょうか?
0208デフォルトの名無しさんNGNG
>>207
rdtscをサポートしてないCPUだとおもう
pentium以降は大丈夫だろう
0209デフォルトの名無しさんNGNG
クロック可変のCPUで酷い目にあう悪寒
0210デフォルトの名無しさんNGNG
PCに搭載されているシリアルポート名を、例えば、COM1、COM2と言った
感じで列挙したいのですが、APIで実現できますでしょうか?

「シリアル 列挙 API」とかでググってたんですが、それらしいAPIが見つから
なかった…(´・ω・`)

0211デフォルトの名無しさんNGNG
とりあえずCreateFileとかしてみてハンドル取得してみるとか
でいいじゃん、めんどくさいし
0212デフォルトの名無しさんNGNG
と言いつつ他の解決法を知らない>>211であった。
0213デフォルトの名無しさんNGNG
HKLM\Software\Microsoft\Windows NT\CurrentVersion\ports
0214210NGNG
>>213のキーから"COMxx"を取得してCreateFileしてハンドルを取得出来た
ポートを列挙する事にしました(`・ω・´)
0215デフォルトの名無しさんNGNG
>210
HKLM\HARDWARE\DEVICEMAP\SERIALCOMM
0216デフォルトの名無しさんNGNG
CreateCompatibleBitmapを使用して、裏画面での描画を行っているのですが、

ウィンドウサイズが変わった時(=このビットマップサイズの元となるHDCのサイズが変わった時)は、
その都度DeleteObject→CreateCompatibleBitmapで良いんでしょうか?
0217デフォルトの名無しさんNGNG
Win32AppricationでCreateFont+TextOutで文字を出力しているのですが、
(y:32,x:16)のサイズのフォントを等幅にするにはどうすればいいのでしょうか。
文字のサイズがデフォルトの(16,8)、(40,20)等の時は大丈夫なのですが、
自分が使いたい(32,16)の時はずれてしまいます。
他にポイントとなりそうな、最後から2番目の引数はFIXED_PITCH | FF_MODERNで
最後の引数は、MSゴシックなどです。そこにメモ帳のFixedSysを指定すると、
フォントのサイズが強制的に(16,8)になってしまいます。
0218デフォルトの名無しさんNGNG
CreateProcess使って同じフォルダのexeを実行したいのですが、
どうすればいいのでしょう?
0219デフォルトの名無しさんNGNG
MSDN嫁
0220デフォルトの名無しさんNGNG
CreateProcess(NULL,"ここにexeのファイル名", 0, 0, FALSE, CREATE_NEW_CONSOLE, 0, 0, &startUpInfo, &procInfo ) ;
でやっても無理でした。
0221デフォルトの名無しさんNGNG
何がどう無理なのか書けよ。エラーなら、GetLastError使うとか。
0222デフォルトの名無しさんNGNG
コンソールアプリでHWNDを取得したいんでつがどうしたら良いでしょうか?
FindWindow(NULL, "test");
だとダメみたいだし、
GetModuleHandle(NULL);
で得たハンドルをHWNDにキャストしたらDirectSoundは初期化出来たんですが、
音が鳴りません。
教えてえろいひと!
0223222NGNG
ああ、お前等ごめんなさい。
FindWindow(NULL, "")でいけますた。
0224デフォルトの名無しさんNGNG
GetModuleHandleはHMODULEだろ。。。

Win2000以降ならGetConsoleWindow()
0225222NGNG
>>224
へたれwindowsなら強引にキャストすればいけるんでないかと思って・・・。

そんなAPIあったのね。
ありがとうえろいひと。
0226デフォルトの名無しさんNGNG
ヘタレなのはお前だろw
0227デフォルトの名無しさんNGNG
ビットマップの透過表示の仕方で、表と裏の2枚分のデータを重ねて
計算して透過させる方法は知っています。

別の方法で、すでに何かが表示してある位置にビットマップを
表示するとき、透過する色を指定するとそこの部分を表示しなく、
前に表示してあったものが消されずにすむみたいなのがあるなら
教えてください。TextOutでいうSetBkMode(hdc,TRANSPARENT);
みたいな感じです。
0228デフォルトの名無しさんNGNG
>>216
その通り。
これが嫌なら、MAXのサイズを前もって確保してみては?

>>217
1文字ずつ表示する。

>>227
BitBltのフラグとかどう?
0229216NGNG
>>228
有難うございます。
0230227NGNG
>>228
BitBltにそれらしきものがありますね。
今まではStretchDIBitsで表示してたのですが、
それには無かったので、気がつきませんでした。
探してみます。ありがとうございました。
0231デフォルトの名無しさんNGNG
Windows2000pro sp4
PlatformSDK + Visual C++ Toolkit 2003

この環境でUS MicrosoftのMSDNサイトを見ながら GetConsoleWindow() を
試そうとしたのですが、コンパイルが通りません。
ヘッダーファイルの中には GetConsoleWindow の宣言も確認できます。
また、他のコードではコンパイル&リンクができてるのでパスの問題でも無さそうです。
何が悪いか分かりますでしょうか?

---------------------------------------------------------------------
#include <windows.h>
#include <stdio.h>
#define _WIN32_WINNT 0x0500
int main()
{
HWND hWnd = GetConsoleWindow();
printf( "このコンソールウィンドウのハンドル : 0x%X\n", hWnd );
return 0;
}
---------------------------------------------------------------------
error C3861: 'GetConsoleWindow': identifier not found,
even with argument-dependent lookup
0232デフォルトの名無しさんNGNG
以下のビットマップを表示するプログラムについての質問です。
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1060403548&res=59&fi=no

まず、お手数ですがexeのある位置になんでもいいのでビットマップを
用意してください。そして、マクロの名前をその名前にしてください。

コールバックの//1のShowBitmapのコメントを外しても
ビットマップが一つしか表示されないのはなぜでしょう。
ShowBitmap内部の//2のコメントを外したときはちゃんと2つ表示されるのに。
0233デフォルトの名無しさんNGNG
>231
Windowバージョンのdefineくらいは#includeの前にしてみなよ
0234231NGNG
>>233

通りました。
理屈をよく考えてみれば当然そうでしたね(汗
どうもありがとうございました。
0235デフォルトの名無しさんNGNG
>>232
BeginPaintとEndPaint

あとは自分で考えれ
0236デフォルトの名無しさんNGNG
>>232
BeginPaint()が二度呼ばれるから、が原因だな。

BeginPaintは、WM_ERASEBKGNDメッセージを発行するので、
DefWindowProcによって、Bitmapを描画する前に、
WNDCLASS.hbrBackgroundのブラシでクライアント領域を塗りつぶす。

処理の流れとしては、
WM_PAINT発行→BeginPaint呼び出し→WM_ERASEBKGND発行→Bitmap描画→
BeginPaint呼び出し→WM_ERASEBKGND発行(ここで先に描いたBitmapが上書きされる)→Bitmap描画→
となっている。
0237232NGNG
>>235
ありがとうございます。調べてみます。
0238232NGNG
リロードしてなかった。

>>236
詳しくありがとうございます。直してみます。
0239232NGNG
あっ、そもそも大きな勘違いをしていました。
StretchDIBitsの時に表示していると思っていました。
TextOutと違い、ShowBitmapなどの名前でないのは、
その場で表示するわけではないからですね。
0240デフォルトの名無しさんNGNG
bigenPaint()したんだけどヘヤーカラーしか変わりません
0241デフォルトの名無しさんNGNG
>>240
そうなる仕様でつ。
0242232NGNG
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
for(y = 0; y < 10; y++)
for(x = 0; x < 10; x++)
ShowBitmap(hwnd, hdc, SHOW_BITMAP, y * 16, x * 16, 1, 1);
EndPaint(hwnd, &ps);
break;
こんな感じにしたら出来ました。

後、GetDCに変えてみると何回もWM_PAINTに行っているみたいで
CPU率がえらい事になっていましたが、return DefWindowProcを
defaultの所に書かずに関数の最後の所に書いたら直りました。
(どのイベントの時でもDefWindowProcを通るようにする)

しかし、ウィンドウズアプリケーションは難しすぎます。
いったいどのやり方でやるのが一番いいのでしょうか。
0243デフォルトの名無しさんNGNG
>>242
こういうやり方をするなら、フレームバッファを構築してそっちで書き換えた方がいいと思われ。
WM_PAINT内は、フレームバッファの内容をBitBltなどで展開するのみに徹した方がいい。
あと、ここまでやりたいのかどうかは知らないけど、途中で画像を書き換えたい場合は、
WM_PAINTメッセージを起こすのではなくGetDCを取得して張り付ける方がいい。
これで、大分負担は減るんじゃないかな。

しかしながら、CPU使用率を考えるくらいなら、まずWindowsプログラムを覚えることを
優先した方がいいんじゃない?
0244232NGNG
>>243
ありがとうございます。
初心者なので何となくは分かるのですが難しいです。
仰るように基本の部分から勉強します。
0245デフォルトの名無しさんNGNG
コールバックで特定のHWNDの時のみ処理したい場合どうすればいいのでしょう。
ウィンドウが一つのときは大丈夫だと思うのですが。
0246デフォルトの名無しさんNGNG
分岐にはif文を使う
0247245NGNG
>>246
ええとそういう事ではなくて。説明不足ですね。
WinMainで"hoge"と"foo"という2つのウィンドウを作ったとき、
どちらのウィンドウにイベントが起こっても同じコールバック関数で
受け取るので、そのときHWNDが"hoge"のHWNDか"foo"のHWNDかを
判断したいのです。
例えばif(strcmp(CheckHWND(hwnd),"hoge")==0)みたいな感じです。
0248デフォルトの名無しさんNGNG
HWNDじゃ無理です。
0249デフォルトの名無しさんNGNG
>>247
ちょっと考えれば解ると思うが、あんたの方法だと、何らかの方法でイベントの発生したウィンドウのHWNDを得なければならない。

で、「イベント」とはなんだ?
0250246NGNG
>>247
SetPropとかすればいいんじゃに?

>>249
ウィンドウプロシージャがよばれるんだろ
0251245NGNG
>>248
何ならできますか。

>>249
イベントとは左クリックとかのWM_**です。

実はひとつのウィンドウ毎にひとつのコールバック関数を作るもの
なんですかね。myProg.lpszClassNameとCreateWindowの第一引数、
myProg.lpfnWndProcとコールバック関数の名前を同じにしますが、
それを2つのウィンドウで別々にすれば、自然と"hoge"でのイベントは
hogeCallへみたいになるんじゃないかと。
実はまだ複数のウィンドウのプログラムを作ったことが無かったので、
実験をすることも無くどうなるんだろうと質問してしまいました。
0252デフォルトの名無しさんNGNG
>>251
定石的にはMFCやATLがやってるように(それぞれ多少手段は違った気がするが)
ウィンドウと対応するC++なりのオブジェクトをつくってウィンドウ毎に処理を分ける。
■ このスレッドは過去ログ倉庫に格納されています