Win32API質問箱 Build18
■ このスレッドは過去ログ倉庫に格納されています
0001 ◆Manna2uCLg
NGNGやさしいオジサマ達が、熱く暑く答えてくれよう。
でも最低限、最新スレくらいは質問する前に検索を。
過去スレ・参考は>>2-5くらいを参照するッス!
0153デフォルトの名無しさん
NGNGそれではまずい場合は
WideCharToMultiByte( CP_ACP, (以下略) );
まあMSDNを見れば一目瞭然なわけだが
0154デフォルトの名無しさん
NGNGまず、全ての標準コントロール (static を含む。NT系列では Comboを除く) は、CS_PARENTDC クラススタイルを
持っているので、描画は親ウィンドウのデバイスコンテキストにを用いて行われます。つまり描画について考える際には、
クリッピング領域とWM_PAINTの発行順だけを考慮すればOKです。デバイスコンテキストは共通だから。
次に、WS_CLIPSIBLINGS は単に全ての兄弟ウィンドウ(の矩形)への描画が行われないように描画範囲をクリップ
するって感じの属性で、Z-Orderは考慮されません。片方を他方の前に持ってきたからといって、前のほうが見える
ようになるわけではありません。
・・・具体的に何がしたいのかを書いてもらった方がもうちょっと実のある返事を書けるような気がする。
0155139
NGNGレスありがとうございます。理解した・・と思いましたが
できませんでした。
わかっていないのか・・_| ̄|○
具体的に作りたいのは自分が何問、何ページ、どの問題集を解いたかを
その日付ごとに教科単位で分けた子ウィンドウBに
(実際には構造体型配列に)記録しておけるプログラムです。
国数理社英
4/11□□□□□
4/13□□□□□
4/14□□□□□ □=子ウィンドウB
こんな感じになります。
この子ウィンドウBにはさらにプッシュボタンを持つ
ボタン子ウィンドウやらエディットやらがつまっています。
そしてもうひとつ、常にメインウィンドウの右下の最前面に存在し
スクロールバーをスクロールしても
メインウィンドウ上での位置を変化させない子ウィンドウAを作り
ここに正解確率やら、こなしたページの数やらを計算して
表示させたいのですが・・
この常に最前面に表示させるという方法がわかりません。
0156139
NGNGWS_CLIPSIBLINGSを外してAにSetWindowPosのHWND_TOPMOSTを使うと
子ウィンドウAとBが重なっているときに
Aが前面に表示されているんですが
下にあるBのエディットに入力できたりしちゃうので
TOPMOSTは常に最前面に出してくれるんじゃなかったのか と
思う一方 自分は最善面という概念もわかっていないような
感じがします。
A、Bの両方にWS_CLIPSIBLINGSを設定して
AにSetWindowPosのHWND_TOPを使ったら
Aは前面に表示されているし重なったとき下のBを操作することも
できなかったので自分の思うようになったのですが
なぜこうなったのかわからないので生きた心地がしません。
長レス&超ド級初心者で申し訳ありません
助けてください_| ̄|○
0157デフォルトの名無しさん
NGNGhttp://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
0158139
NGNGサンクス!!!
まだちょっとしかみてないけど
今の自分にぴったりかもしれません
見てみます
0159デフォルトの名無しさん
NGNGググってもvbに関しての情報がなくつまってます・・・
誰か助けてくだされ
0160159
NGNG失礼
0163デフォルトの名無しさん
NGNG0165159
NGNG159&160は自分です。
使い方はもちろんのことわかっております。
検索しても情報が少なく、accessについてるやつ引っ張れそうなんで
"解決"判を押させてもらいました。
スレ汚しスマソ
0166デフォルトの名無しさん
NGNGどうやって解決した?
気になるじゃないか。
0167デフォルトの名無しさん
NGNG0168159
NGNG0169デフォルトの名無しさん
NGNG質問があったけどまた後で来まつ。ノシ
0170159
NGNG解決といこうとしたんですが・・・
ちっと戦ってます。
ACCESSのSHChangeIconDialogに関して情報が載ってるソースあったんで
Shell32.dllから隠しでもってきて使ってみました。
したらばmsgboxが出てきて、文字化けたような
"ファイルxxxxxxxxがみつかりません。"と表示され
%SystemRoot%\system32\SHELL32.dll内のアイコンのリストビューがでます。
ンデ戦ってます。
0171デフォルトの名無しさん
NGNGstrBuff = StrConv("c:\winnt\explorer.exe" & vbNullChar, vbUnicode)
Call SHChangeIconDialog(Me.hWnd, strBuff, 0, 0)
で行けたにょ(Win2K)。細かい部分は任せた。
0173デフォルトの名無しさん
NGNG音楽が流れていると音が細切れになることから、これはリソースを独占して他のスレッドにリソースがうまく行き渡っていないからなのだと思うのですが、ここまでの解釈は合ってますよね?
で、うちのPCは常時CPU使用率が100%付近にきていて、しょっちゅうフリーズしてしまうという状況なのです。
これが上述の自分で作ったプログラムの症状と酷似している事から、どうやらメッセージループでリソースを独占している常駐ソフトがある、と睨んだところまではいいのですが
一通りのスタートアップ&サービスを止めてみたのですがだめぽでした。
こういうリソースを独占して他のアプリに迷惑をかける常駐ソフト(スレッド?)を見つける手段というのはあるのでしょうか?
また、クロック数の高いCPUに取り替えれば力押しでフリーズしないようになるのかどうか聞きたいのですが。
参考までに、ここの方と似たような症状です。
http://www21.ann.co.jp/pas/bbs6/lg115620.html
0174デフォルトの名無しさん
NGNG0175デフォルトの名無しさん
NGNGそれ本気で知りたきゃ、実際に配布して試してもらえば?
0177デフォルトの名無しさん
NGNGおまえのPCだけがおかしいんじゃないのか
ウィンドウだけのプログラムでそんなことにはならない。
0179デフォルトの名無しさん
NGNG> こういうリソースを独占して他のアプリに迷惑をかける常駐ソフト(スレッド?)を見つける手段というのはあるのでしょうか?
タスクマネージャ
Windows Xp 質問スレ 86ページ目
http://pc5.2ch.net/test/read.cgi/win/1081622045/
0180デフォルトの名無しさん
NGNGメッセージループでGETMESSAGEだっけを使ってない。のかも??
PEEKMESSAGEのみだとそんな感じだったような気がする。
WHILEでCPUリソース食ってるとかそんなんじゃなかったかな??
あと、スペル間違ってるかも。
0181139
NGNG子ウィンドウ の項目までとりあえず読ませていただきました
まず クリップっていうのは
描画するにあたって関係のない領域を
描画する領域から排除するっていう感じでよろしいのでしょうか??
本文中に
"システムはクリッピング リージョン外の描画を廃棄 (クリップ) するため"
と一応しっかり書いてあるのですがちょっと自信がなくて・・
それで、
>兄弟ウィンドウは、 Z順序と逆の順番でWM_PAINTメッセージを受け取ります
>このため、 Z順序の最上位の (いちばん前の) ウィンドウは、
>最後にWM_PAINTメッセージを受け取ります。
つまりはZオーダーというものは描画処理の順番を決めることで
前後関係をうまく表現しているだけであるということなんでしょうか。
Zオーダーが下であるウィンドウからWM_PAINTは呼ばれ
を指定したウィンドウは描画する際に
兄弟ウィンドウの領域をクリップするなら
を指定した兄弟ウィンドウ同士が重なる場合は
Zオーダーと逆の順番で重ねられたカタチになるのかな・・
使い慣れない言葉に正確にイメージできてるかわからない概念で_| ̄|○
変な文章になってたらすいません。
再び おねがいします。
0182デフォルトの名無しさん
NGNG上記をコンソールウィンドウのように、printfの代用としてメッセージ表示に用いているのですが、
僕自身がEM_REPLACESELを使用しているためか、表示処理がかなり遅く感じます。
(可能な限り、行単位で表示できるように処理してはいますが)
より速度を求める場合は、ウィンドウに直接書く(TextOut)しかないのでしょうか?
0183デフォルトの名無しさん
NGNG0184デフォルトの名無しさん
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あのね。標準関数というのは、その環境でちゃんと動くように作られてるんだよ。
0186デフォルトの名無しさん
NGNGWindowsというかVCのCRTも最終的にはCreateFileを呼んでるけど。
fopenはCの規格に含まれる関数であって、OSのそれじゃない。
ネイティブで実装しているOSがあるかもしれないけど、それは今関係無い。
OSのサービスをC標準に準拠するようにラップするのが普通。
>>184みたいな事を言い出したら、mallocを使っていたとしても
いちいちHeapAlloc使ってますって言わなきゃならんのか?
0187デフォルトの名無しさん
NGNG話は逸れるが、fopen()のオープンモード拡張して排他制御できたらいいとはちょっと思う。
0188デフォルトの名無しさん
NGNG引用もとの発言者がしているのは、標準Cライブラリだけに依存している
プログラムはソースコードレベルで移植性があるよね、という話。
標準Cライブラリが動作する環境ならMakeかけなおすだけで大抵動く。
標準Cライブラリ自体は、あなたの言うとおりOSに依存するので移植性はない。
0189デフォルトの名無しさん
NGNG別に移植性云々じゃなくてたしかにCreateFileのほうがfopenより多機能だが、
大抵の状況では必要ないからfopenで十分だろ、って程度じゃないか?
0190デフォルトの名無しさん
NGNG183氏が
> 前スレ見てて不思議に思った
のは
> > 将来の別プラットホームや別プロジェクトへの移植も考えると、C標準でほぼ十分。
のくだりに関してだから、ここでいう移植とはこういう意味である、という
事でああいう風に書いた。
元発言の主旨はなにか、という話なら多分あなたの言う事が正しいのだろう。
0191デフォルトの名無しさん
NGNGVisual 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デフォルトの名無しさん
NGNG0193デフォルトの名無しさん
NGNGまだまだ某は生きると思われ
0194デフォルトの名無しさん
NGNG0195デフォルトの名無しさん
NGNGIn 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デフォルトの名無しさん
NGNG0197デフォルトの名無しさん
NGNGWindows 2000/XPについてです。
GetComputerObjectName かと思って試したんですが
ドメインに入っていないマシンだとERROR_CANT_ACCESS_DOMAIN_INFOという
エラーが出てしまいます。
0198デフォルトの名無しさん
NGNGコマンドラインベースだと某のコンパイラの方が使いやすい
0199デフォルトの名無しさん
NGNG0200デフォルトの名無しさん
NGNG0201デフォルトの名無しさん
NGNG落として一通りEULAに目通してみたけど、
どこをどう読んだら「商用アプリ不可、$5.0を超える手数料の徴収不可 」になるんだ?
0202デフォルトの名無しさん
NGNG少なくとも、$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ここはちょっと英語力に自信が無いから微妙だけど
0204デフォルトの名無しさん
NGNG0205デフォルトの名無しさん
NGNG0206デフォルトの名無しさん
NGNG0207デフォルトの名無しさん
NGNGハードウェアが高分解能パフォーマンスカウンタをサポートしてない
PCってあるのでしょうか?
0208デフォルトの名無しさん
NGNGrdtscをサポートしてないCPUだとおもう
pentium以降は大丈夫だろう
0209デフォルトの名無しさん
NGNG0210デフォルトの名無しさん
NGNG感じで列挙したいのですが、APIで実現できますでしょうか?
「シリアル 列挙 API」とかでググってたんですが、それらしいAPIが見つから
なかった…(´・ω・`)
0211デフォルトの名無しさん
NGNGでいいじゃん、めんどくさいし
0212デフォルトの名無しさん
NGNG0213デフォルトの名無しさん
NGNG0215デフォルトの名無しさん
NGNGHKLM\HARDWARE\DEVICEMAP\SERIALCOMM
0216デフォルトの名無しさん
NGNGウィンドウサイズが変わった時(=このビットマップサイズの元となるHDCのサイズが変わった時)は、
その都度DeleteObject→CreateCompatibleBitmapで良いんでしょうか?
0217デフォルトの名無しさん
NGNG(y:32,x:16)のサイズのフォントを等幅にするにはどうすればいいのでしょうか。
文字のサイズがデフォルトの(16,8)、(40,20)等の時は大丈夫なのですが、
自分が使いたい(32,16)の時はずれてしまいます。
他にポイントとなりそうな、最後から2番目の引数はFIXED_PITCH | FF_MODERNで
最後の引数は、MSゴシックなどです。そこにメモ帳のFixedSysを指定すると、
フォントのサイズが強制的に(16,8)になってしまいます。
0218デフォルトの名無しさん
NGNGどうすればいいのでしょう?
0219デフォルトの名無しさん
NGNG0220デフォルトの名無しさん
NGNGでやっても無理でした。
0221デフォルトの名無しさん
NGNG0222デフォルトの名無しさん
NGNGFindWindow(NULL, "test");
だとダメみたいだし、
GetModuleHandle(NULL);
で得たハンドルをHWNDにキャストしたらDirectSoundは初期化出来たんですが、
音が鳴りません。
教えてえろいひと!
0223222
NGNGFindWindow(NULL, "")でいけますた。
0224デフォルトの名無しさん
NGNGWin2000以降ならGetConsoleWindow()
0226デフォルトの名無しさん
NGNG0227デフォルトの名無しさん
NGNG計算して透過させる方法は知っています。
別の方法で、すでに何かが表示してある位置にビットマップを
表示するとき、透過する色を指定するとそこの部分を表示しなく、
前に表示してあったものが消されずにすむみたいなのがあるなら
教えてください。TextOutでいうSetBkMode(hdc,TRANSPARENT);
みたいな感じです。
0228デフォルトの名無しさん
NGNGその通り。
これが嫌なら、MAXのサイズを前もって確保してみては?
>>217
1文字ずつ表示する。
>>227
BitBltのフラグとかどう?
0230227
NGNGBitBltにそれらしきものがありますね。
今まではStretchDIBitsで表示してたのですが、
それには無かったので、気がつきませんでした。
探してみます。ありがとうございました。
0231デフォルトの名無しさん
NGNGPlatformSDK + 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デフォルトの名無しさん
NGNGhttp://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デフォルトの名無しさん
NGNGWindowバージョンのdefineくらいは#includeの前にしてみなよ
0235デフォルトの名無しさん
NGNGBeginPaintとEndPaint
あとは自分で考えれ
0236デフォルトの名無しさん
NGNGBeginPaint()が二度呼ばれるから、が原因だな。
BeginPaintは、WM_ERASEBKGNDメッセージを発行するので、
DefWindowProcによって、Bitmapを描画する前に、
WNDCLASS.hbrBackgroundのブラシでクライアント領域を塗りつぶす。
処理の流れとしては、
WM_PAINT発行→BeginPaint呼び出し→WM_ERASEBKGND発行→Bitmap描画→
BeginPaint呼び出し→WM_ERASEBKGND発行(ここで先に描いたBitmapが上書きされる)→Bitmap描画→
となっている。
0239232
NGNGStretchDIBitsの時に表示していると思っていました。
TextOutと違い、ShowBitmapなどの名前でないのは、
その場で表示するわけではないからですね。
0240デフォルトの名無しさん
NGNG0241デフォルトの名無しさん
NGNGそうなる仕様でつ。
0242232
NGNGhdc = 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こういうやり方をするなら、フレームバッファを構築してそっちで書き換えた方がいいと思われ。
WM_PAINT内は、フレームバッファの内容をBitBltなどで展開するのみに徹した方がいい。
あと、ここまでやりたいのかどうかは知らないけど、途中で画像を書き換えたい場合は、
WM_PAINTメッセージを起こすのではなくGetDCを取得して張り付ける方がいい。
これで、大分負担は減るんじゃないかな。
しかしながら、CPU使用率を考えるくらいなら、まずWindowsプログラムを覚えることを
優先した方がいいんじゃない?
0245デフォルトの名無しさん
NGNGウィンドウが一つのときは大丈夫だと思うのですが。
0246デフォルトの名無しさん
NGNG0247245
NGNGええとそういう事ではなくて。説明不足ですね。
WinMainで"hoge"と"foo"という2つのウィンドウを作ったとき、
どちらのウィンドウにイベントが起こっても同じコールバック関数で
受け取るので、そのときHWNDが"hoge"のHWNDか"foo"のHWNDかを
判断したいのです。
例えばif(strcmp(CheckHWND(hwnd),"hoge")==0)みたいな感じです。
0248デフォルトの名無しさん
NGNG0249デフォルトの名無しさん
NGNGちょっと考えれば解ると思うが、あんたの方法だと、何らかの方法でイベントの発生したウィンドウのHWNDを得なければならない。
で、「イベント」とはなんだ?
0251245
NGNG何ならできますか。
>>249
イベントとは左クリックとかのWM_**です。
実はひとつのウィンドウ毎にひとつのコールバック関数を作るもの
なんですかね。myProg.lpszClassNameとCreateWindowの第一引数、
myProg.lpfnWndProcとコールバック関数の名前を同じにしますが、
それを2つのウィンドウで別々にすれば、自然と"hoge"でのイベントは
hogeCallへみたいになるんじゃないかと。
実はまだ複数のウィンドウのプログラムを作ったことが無かったので、
実験をすることも無くどうなるんだろうと質問してしまいました。
0252デフォルトの名無しさん
NGNG定石的にはMFCやATLがやってるように(それぞれ多少手段は違った気がするが)
ウィンドウと対応するC++なりのオブジェクトをつくってウィンドウ毎に処理を分ける。
■ このスレッドは過去ログ倉庫に格納されています