Win32API質問箱 Build18

このエントリーをはてなブックマークに追加
1 ◆Manna2uCLg
スレ立てるまでもない、Win32APIについての質問はこちらへどうぞ。
やさしいオジサマ達が、熱く暑く答えてくれよう。
でも最低限、最新スレくらいは質問する前に検索を。
過去スレ・参考は>>2-5くらいを参照するッス!
2 ◆Manna2uCLg :04/04/12 02:03
3
 4
WriteFileの後にLastErrorをやってみると、6が返ってきました。
このエラーコードって簡単に調べる方法ないですか?

MSDN
>>5
Visual C++ エラールックアップ
85:04/04/12 10:57
はやっ!
ヘッダーファイルとかに定義されては無いんでつか?
9デフォルトの名無しさん:04/04/12 11:05
FormatMessage 関数を使って、GetLastError 関数が返したシステムエラーコードに対応するエラーメッセージ文字列を取得できます。次にサンプルコードを示します。
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // 既定の言語
(LPTSTR) &lpMsgBuf,
0,
NULL
);
// lpMsgBuf 内のすべての挿入シーケンスを処理する。
// ...
// 文字列を表示する。
MessageBox(NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION);
// バッファを解放する。
LocalFree(lpMsgBuf);
10デフォルトの名無しさん:04/04/12 11:08
>>8 WINERROR.H
115:04/04/12 11:20
みなさん、さんきゅ

”#define ERROR_INVALID_HANDLE 6L” でいいや

でもCreateFileは、うまくいってみたいだしぃー
ハンドルも返ってきてるし渡してるしぃ・・・ブツブツ・・・
バッファオーバーフローでハンドル格納したメモリが破壊されてるに1票
じゃあ、WriteFileが成功してるのに、
エラーコードを取得しているに1票
夢オチに1票
夢の中でプログラム組んでた翌日は、とてつもなく疲労している自分がいる。
Win32APIでマウスの移動量を取得する方法ってありますか?
例えば、画面左端にマウスカーソルがある時に、さらに左に
動かしてもその移動量が取りたいのです。

DirectPlayならできるのはわかったんですが、それだけの為に
DirectX必須にするのも考え物なので…。
VBからのWin32APIでもいいですか?

Dim hFile As Long
Dim udtProcInfo As PROCESS_INFORMATION

hFile = CreateFile( _
"OUTPUT.txt", _
GENERIC_WRITE + GENERIC_READ, _
FILE_SHARE_READ, 0,CREATE_ALWAYS, _
FILE_ATTRIBUTE_NORMAL + FILE_FLAG_OVERLAPPED, 0)
ZeroMemory si LenB(si)
si.cb = LenB(si)
si.hStdOutput = hFile
si.hStdError = hFile
si.dwFlags = STARTF_USESTDHANDLES
rc = CreateProcess( _
0, "printf.exe", 0, 0, 1, 0, 0, 0, _
udtStartInfo,udtProcInfo)

OUTPUT.txtは出来ました。 
CreateProcessも一応通ります。
printf.exeは main(){printf("\nhelle world");}です。
でもOUTPUT.txtは、空のままです。

CreateProcessの5番目のパラメータを0にして
notepad.exeならうまく行きます。

なんでじゃい!?
>>17
フラグセットを+演算子で記述するのは始めて見た。
最上位ビットがおかしくなるかもしれない。
ま、最上位ビットまで使うフラグはあまりないけど。
発見された方 マルチをお許しください。
MFCのDLLを作成しているのですが
OnIdleイベントが発生しないんです。このメンバ関数って
もしかしてEXE(アプリケーション)のみ有効なメッセージ制御なのでしょうか?
DLLの場合 これに変わる処理ってどれにあたるかご存知ありませんか?
要はInitInstanceで構築したビューにメッセージキューがない場合
(ユーザーが何も命令を送らない間)
常に発生させたいです
> フラグセットを+演算子で記述
前にも見たことあるんだけど、例えば WS_CAPTION + WS_BORDER だけでもバグるよな。
21デフォルトの名無しさん:04/04/12 20:05
>>19
OnIdle()は、メッセージキューがなくなる度に一回だけ呼ばれるって意味。
WM_TIMERなどの定期的なメッセージ処理があれば、
OnIdle()もそれに従って呼び出される。
また、逆にWM_TIMERでのOnIdle()呼び出しを避ける手法もMSDNに掲載されてる。
VBだと「Or」では視覚的に区切りとして分かりにくいから
あえて「+」を使うことがあるみたい
ビットフラグに"+"を使うやつは…
間違えて同じ値を二度書いたときに...
視覚的に間違えたと分かるケースならいいけど、
まあ、しょうがないよ
メイドロボだし
27デフォルトの名無しさん:04/04/13 06:55
Win32APIではなくってリソーススクリプトの質問なのですが
MENUITEM "abc", 101, CHECKED
と書くと「v」みたいな印が abc の隣に表示されます

IEのメニューでも表示→ツールバー以下のメニューで
いくつかの項目のON/OFFを選択できますが、
この部分の仕組みに似ていると思いました

で肝心の質問なのですが、この CHECKED を付けても
ただ単に印がつくだけのようですが、ラジオボタンのように
いくつかの項目がグループになっていてどれかを選択すると
自動的に印が移動してただひとつだけが選択されている、とか
チェックボックスのように、選択するたびにON/OFFが切り替わる、とか
そういった自動機能をリソーススクリプトで書くにはどうしたら
いいのでしょうか?
もしかしたら、ないのでしょうか?
自分で GetMenuState() とか CheckMenuItem() とかを
プログラム内で使うのでしょうか?
BitBlt()について質問です。
MSDN libraryのラスタオペレーションPATINVERTとかの説明に
「指定したパターン」
とあるのですが、そのパターンはどうやって指定するんでしょうか?
>>29
指定したHDCに関連づいてるブラシを利用するはず。
どんな風にパターン作るかは、MSDNのCreateBrushIndirect()あたりでも見てくれ
>>27
そんな自動でやってくれる機能なんて多分無い。
APIにもそういった関数はないし。
だから、全部自前でやることになると思う。
クラスライブラリとかでそういうのを自動化しているものはあるかもな。
>>27
GUI周りで楽をしたきゃ、素直にMFCに移行した方がええで。
いまさら死滅寸前でGUI周りが全然楽じゃない
MFCに移行してもしょうがないだろ。
>>27
(`・ω・´)っ[ TMenuItem::RadioItem ]
36デフォルトの名無しさん:04/04/13 16:53
>>21

レスありがとうございます。
ということはDLLであってもフレームウインドウ等のMN_TIMER
をメッセージとして追加する事で
OnIdleを有効にすることが可能となるのでしょうか?

希望となるヒントをいただき感謝しております。
3729:04/04/13 18:18
>>30
レスありがとうございます。

>指定したHDCに関連づいてるブラシを利用するはず。
そのHDCはどうやって指定するのでしょうか?
下記のようにやってみましたが真っ黒になりました。

PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);

HDC hdc2 = CreateCompatibleDC(hdc);
HBRUSH hbr = CreateSolidBrush(RGB(255, 255, 0));
SelectObject(hdc2, hbr); // 黄色ベタ塗り

// 青と黄色の模様が描かれたビットマップ(80 x 40)
HBITMAP hbmp = LoadBitmap(hInst, "MYBMP");
SelectObject(hdc, hbmp);

// 青はそのままで黄色→黒になる?
// 「黄色いビットマップ使ってSRCINVERT」と同じ?
BitBlt(hdc, 0, 0, 80, 40, hdc2, 0, 0, PATINVERT);
>>37
いくつか間違いを犯しているわけだが…

まず、画面のHDCにHBITMAPのSelectObjectはできない。
戻り値を確認しましょう。

次に、パターンを指定するのは描画先に指定する。
つまりBLACKNESS等と同様に6〜8番目引数は使わない。

最後に、成功したとしても青はそのままじゃなくて白になる。
39デフォルトの名無しさん:04/04/13 20:07
キー入力を取得する時に、
初回から押しっぱなしの取得をするにはどの様にすればよいのでしょうか。

case WM_KEYDOWN:
int key_code = (int)wPlam

上記の方法ですと、最初のときだけ押しっぱなしにしている扱いにならず困っているのですが。
どうかご教授お願いします。
40デフォルトの名無しさん:04/04/13 20:08
訂正 int key_code = (int)wParam;
>>39
GetAsyncKeyState
>>39
こういうのも

static BOOL key_code[256];

case WM_KEYDOWN: key_code[wParam]=TRUE; break;
case WM_KEYUP: key_code[wParam]=FALSE; break

//使う時
if(key_code[VK_○○]) 処理;


メモリがもったいなきゃ32バイト確保して各ビットごとに割り当てるとか
4339:04/04/13 22:02
>>41
>>42
レスありがとうございます。
GetAsyncKeyStateや、
WM_KEYUPを併せて使用する方法も検討したんですが、
ここまで簡素にできるとは思いませんでした。
両方とも試してみます。
4437:04/04/13 22:27
>>38
ありがとうございます。

>まず、画面のHDCにHBITMAPのSelectObjectはできない。
>戻り値を確認しましょう。
はい。確かに戻り値は0でした。

>次に、パターンを指定するのは描画先に指定する。
>つまりBLACKNESS等と同様に6〜8番目引数は使わない。
要するに、PAT〜を指定したときには
・ビットマップなんて関係ない
・矩形をハッチ等指定したブラシで埋め尽くす
・ってことはPatBlt()と同じ
ということで間違いありませんか?
45デフォルトの名無しさん:04/04/13 23:44
http://black.sakura.ne.jp/~third/system/winapi/win.html
って、ペゾルト本のパクリ?
>>44
> ってことはPatBlt()と同じ
ほぼ正解。

ほぼというのは、PATPAINTだけはコピー元が必要だから
それだけはPatBltじゃ無理。まぁ、見落としてるだけだと思うが。
4744:04/04/14 00:26
>>46
レスありがとうございます。

>ほぼというのは、PATPAINTだけはコピー元が必要だから
>それだけはPatBltじゃ無理。
そうですね。

やっと理解できました。
48デフォルトの名無しさん:04/04/14 00:26
.net frameworkが次windowsで標準となるらしいですが、
win32apiはまだまだ使えるのでしょうか?
>>48
使える。Windows 95 のときも 3.1 のアプリ動いたでしょ。
>>42
キーダウン中にマウス操作でkillFocusしてキーを放すとフラグがクリアされません。
>>50
MS謹製のIntelliPoint4.1でもそのバグがあったね(w
BO2Kのようにタスクマネージャから見えないようにするのはどうすればいいんだろう?
そもそもどうやってステレスにしてんのか原理が分からんし
悪いソフトをつくろうとしてるわけじあqwせdrftgyふじこl
> qwせdrftgyふじこl

CreateWindowEx
54デフォルトの名無しさん:04/04/14 14:12
BMP,JPEG,GIF,TIFF,PNGなどの色々な形式の画像ファイルを読込んで、
HDCで描画したいのですが、画像ファイルを読込むのに便利なAPIはないでしょうか?
LoadImageは、BMP形式しか読込めないので却下です。
普通にファイル読んで解析してCreateBitmap汁
56デフォルトの名無しさん:04/04/14 14:33
>>54

OleLoadPicture
>>54
Susie Plugin
>>54
GDI+

WIN32APIと言えるかどうかは知らぬ
ttp://www.kumei.ne.jp/c_lang/sdk4/sdk_336.htm
59デフォルトの名無しさん:04/04/14 15:20
メッセージキューからある特定のメッセージだけを取り除きたいのですが
どうやればよいの?

その「取り除きたい」と思うタイミングにおいて、そのメッセージはそれ以上来ないという状況です。
つまり取り除き処理直後に飛んできた、ということはないです。

>>59
PeekMessage
PeekMessageじゃダメなのか?
62デフォルトの名無しさん:04/04/14 18:01
>>60-61
ありがと♪
6350:04/04/14 18:24
テンキーの"1"をDOWM ---> WM_KEYDOWN VK_NUMPAD1
NUMLOCKをDOWN
NUMLOCKをUP
テンキーの"1"をUP ---> WM_KEYUP VK_END
64デフォルトの名無しさん:04/04/14 19:12
#include <windows.h>
int main(void)
{
MSG msg;
GetMessageSuper(&msg);//☆
printf("%c\n",msg.wParam);
return 0;
}
//☆みたいにウィンドウズメッセージを戻り値かポインタ引数で
得ることが出来るAPIはないでしょうか。
何も無いときはそこ(OS)でとどまっています。

while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
これのコールバックを経由しなくてもいいバージョンです。
WindowProcが邪魔なら、WNDCLASS(EX)のlpfnWndProcにDefWindowProcを登録してみたら?
で、Get/Translate/Disptachをセットにして呼べばどうにかなるんじゃない?

ただ、その後でメッセージを処理してもWindowProc内と同じことにはならないと思うぞ。
6664:04/04/14 21:30
>>65
ありがとうございます。今調べていますが、難しいです。

後、>>64に追加で、いままでは以下のような感じで、
MSGの残骸を利用してやっていました。

void hoge(HWND hwnd)
{
 MSG msg;
 while(1)
 {
  GetMessageSuper(&msg);
  if(msg. ...) ;
 }
}

void GetMessageSuper(MSG*msg)
{
if(!GetMessage(*(&msg),NULL,0,0))exit((*msg).wParam);
TranslateMessage(*(&msg));
DispatchMessage(*(&msg));
}
つーか、Dispatchを呼ばなきゃ良いだろ?
あれは
(WNDPROC)GetWindowLongPtr(msg.hwnd, GWLP_WNDPROC)(msg.hwnd, msg.message, msg.wParam, msg.lParam);
を呼んでるだけだから。
6864:04/04/14 23:41
>>67
ありがとうございます。勉強になります。
6948:04/04/15 00:18
>>49
レスありがとうございます。

今学ぶなら.netの方がいいのでしょうか?
少しですがwin32apiが使える状態です。
基本的にジャンルが違う気もしますが
>>39
LPARAMの30bit目じゃダメなのか?
>>69
んーその質問は答えるのが難しいねぇ。おいらの場合は業務で
使う or 使いたい言語を学習するし。

ただまぁあれだ、.NET Frameworkは国際化対応を結構真面目に
考慮してる辺りが、おいらの業務にドンピシャなので、次回のプロ
ジェクトでは.NET Frameworkで進めようと画策中。

それに必要であれば.NET Frameworkでの開発でもWin32APIを
叩けるしね。
72デフォルトの名無しさん:04/04/15 01:00
こんにちわ
初歩的な事で申し訳ないのですが
(だからこそ載ってなくてわからないんだけど)
兄弟ウィンドウ同士が重なり合った場合
その前後を決めるものは一体何なのでしょうか
作りたいのは
メインウィンドウ
┣子ウィンドウA
┗子ウィンドウB(スタティックスタイル)
 ┗ボタンやエディット

という状態のときに(本当はもっとごちゃごちゃしてるんですが)
この子ウィンドウAを常に最前面に出しておきたいのです が
SetWindowPosでHWND_TOPMOSTを指定しても
子ウィンドウBの下に表示されてしまうので
兄弟ウィンドウの間では
Zオーダーがどうとかアクティブがどうとか
そういう問題ではなくなるのか??と思ったんですが
HWND_TOPを指定すると
ちゃんとウィンドウAがとりあえずは最前面に表示されましたので
コレは一体どういうことなんだろうって感じになってます

超初心者の質問ですいません おねがいします
ホームページを開いた時になるMIDIを捕らえて
音量を制御したいです。

具体的には
WAVEを聴きながらMIDIの音量(dB?)を監視していて
検知したらWAVEの音量を下げるという感じです。

だいたいは実現方法がわかったのですが、
MIDIの音量の監視が出来ません。
MIDI音源のOUTを取得しそのまま出力するにはどうすればいいのでしょうか?
具体的な関数名を教えていただければうれしいです。
子ウィンドウをTOPMOSTにできるの?
>>73
仮想midiドライバ書いて、実際のドライバにリダイレクトさせたら?
7673:04/04/15 01:53
>>75
レスありがとうございます。

wave再生は割と簡単に出来たのでもう少しがんばれば
できるかと思いましたが、仮想midiドライバとなると
難しそうですね。

よく分からないのですが、
どのような感じになるのでしょうか?
7772:04/04/15 03:05
>>74

ありゃー やっぱ僕
基本がわかってないみたいですね
となると兄弟ウィンドウの前後関係(?)を決める要因は
なんなんでしょうか
それとも兄弟関係に前後も何も存在しないという
考え方なのでしょうか
HWND_TOPは使えてHWND_TOPMOSTが使えない理由は
どういうことなんでしょうか
char test1[128], *test2;

GetDlgItemText(hDlg, IDTXT, test1, (int)sizeof(test1));
GetDlgItemText(hDlg, IDTXT, test2, (int)sizeof(test2));
MessageBox(hDlg, test1, "test1", MB_OK);
MessageBox(hDlg, test2, "test2", MB_OK);

こうするとメッセージボックスにtest1は表示されるのですがtest2の方は何も表示されません。
何が異なるのでしょうか?
また、test2の宣言で表示させる方法はあるのでしょうか?
test2 = (char*)LocalAlloc(LMEM_FIXED, 128);
LocalFreeも忘れるなよ、約束だ!
>>79 氏に加えて
GetDlgItemText(hDlg, IDTXT, test2, (int)sizeof(test2));

GetDlgItemText(hDlg, IDTXT, test2, 128 );
にするのも忘れずにな!
>>78
API以前の問題で
char test1[128];

char* test2;
の違いを理解していないのではないかと思われる。
C標準ライブラリ関数のstr〜系の関数と
Win32APIのlstr〜系の関数は使い分ける必要があるんですか?
83デフォルトの名無しさん:04/04/15 12:58
>>77
基本的には Zオーダー順になる。ただし、WS_CLIPSIBLINGS が付いている場合には、
Zオーダーとは関わり無く兄弟ウィンドウによってクリップされてしまうので、
普通に重ね合わせたような表示にはならない。
WS_TRANSPARENT とかの有無によっても再描画時の見かけは変わってくるし。

これでOK?
84デフォルトの名無しさん:04/04/15 12:59
>>82
lstr〜、wsprintf 等の Win32 側の関数は、引数が TCHAR を基本としているので、
ユニコードでビルド可能。
>>55
それを言うなら CreateDIBSection() だろ。
>>82
しかしwsprintfは標準ライブラリのsprintfに比べて貧弱だったりするので注意。(BCB6の場合。VC++は知らん)
ランタイムを使った方が高速なんじゃなかったっけ。
msvcrtって結構アルゴリズム的には最適化されてるんじゃないか
>>86はなんだ。BCBを入れるとWin32APIの実装が変わるのか。
>>85
DIBは素人にはお勧めできない。
使い方間違えると、あっという間にメモリリークさせてOSぶっ飛ばす諸刃の剣。
>>89
どこをどう読めばそういう結論が出るのか小一時間(ry
>>89
じゃなくて、BCBのsprintfが、wsprintfより貧弱かもっつーことだろ。
>>92
逆だろ
自分の場合CreateThreadで作成したスレッド内でランタイム使うと
メモリーリークするってMSDNに書いてあるのでwsprintfとlstr系に統一した

ランタイム使いたい人は_bigenThreadExとかつかえばいいんだけどね
9582:04/04/15 14:13
>>84
ありがとうございます。
ユニコードの環境ではプログラミングしたことがないので知りませんでした。
Windowsでの文字列絡みのプログラミングでは
できるだけWin32APIを利用した方が良いということですね。
>>94
_bigenThreadExって(藁

どうせ、なかでCreateThread呼んでるんだし、
最初っから_beginthreadex呼んでいいと思うんだけどね
9792:04/04/15 14:15
>>93
そうだった。スマソ
>>95
そうでもないよ
16ビット環境ではAPI版は「FARポインタを渡せる」というメリットがあった
16bit環境でも、少なくともMSC/VCには_f〜っつー明示的FARポインタ用関数はあったが。
>>96
bigen早染めw
>>92-93
どっちでもいいけど、とにかくsprintfもwsprintfも仕様が決まってるだろ。
BCBはこれらに対して仕様外な何か特別なことしてるのか?
103デフォルトの名無しさん:04/04/15 15:50
教えてください。
win32のlstrcpyと標準Cライブラリのstrcpyですが
これはどう使い分けるのでしょうか?
wsprintf は、書式に浮動小数点が使えません。

そういうことなんじゃねーの?
>貧弱
だからそれはBCBもVCも同じに決まってんだろゴルァって話じゃねーの?
要するにVCやBCのそれはANSIとかのそれより機能が豊富だったりするが、
wsprintfはそこまでも機能が無いということだろ。
こんな下らない事で論争が出来るおまいらは素敵過ぎる
論争になどなり得ない問題のはずなのだが。
APIスレの話題じゃないな
一応APIなんだがな。
話してるのは>>86のことだろう。
>>86だと、BCB6のwsprintfとVC++のwsprintf、
またはBCB6のsprintfとVC++のsprintfがあたかも別物のような書き方だから。
wsprintfもsprintfもそれぞれWin32APIとCで仕様が決まってるんだから、
「BCB6の場合。VC++は知らん」なんて、二つのコンパイラを区別する必要ないじゃん?と。
112デフォルトの名無しさん:04/04/15 19:21
>>111
86 は VC++ のことは知らんから、「VC++ は知らん」って言ってるだけでは?
漏れは逆に VC++ 使いだから、BCB6 の sprintf が ANSI 準拠かどうか知らんし。
さて、収まったかと思ったら、またバカの出現で数歩後退しました。
>>112
持って無くてもそれくらいはわかるだろう・・・
何十年も前に発売されたものじゃないんだから・・・
それより>>106の意味がいまいちよくわからないんだけど。
「それ」って具体的に何?sprintfのこと?VCやBCのsprintfはANSIのより機能が豊富なの?
すべてはい(A)
スルーされてるけど>>45ってどのへんがパクリなん?
初めの方をペゾルド本と見比べてみたけど
特にパクった文章は見当たらないんだが。
>>83
WS_CLIPSIBLINGSって難しいね
挙動が理解できない
訪問者を増やすための作者の自作自演では
>>117
パクりかは知らないが、俺はあれでw32apiプログラミングを学んだ。猫より記述が正確、構造がマシ(猫の破綻しきった
論理構造よりはマシという意味)で変数の命名規則もそれほど腐ってなかったから。
関係無いがこんなクソスレあったんだな。

【漏れは】猫でもわかる質問スレ【猫以下です】
http://pc5.2ch.net/test/read.cgi/tech/1054813207/

でもレバーの指摘はちょっと笑った。
122デフォルトの名無しさん:04/04/15 20:36
>>117
なんつーか、出てくる項目とその並びがほとんどペゾルト本なんだよな。
いきなりUnicode対応のための項があったり、最後にちょこっとWinSockの項があったり。
とか言いながら、俺も結構勉強させてもらったが。
質問なんですが、Win98vb6sp5の環境だとちゃんと機能するのですが。
WinXPvb6sp5の環境だとZip32.dllのところでオーバーフローしてしまいます。
これって直せるんでしょうか?ちなみにこんな感じです。
Dim FN As String
Dim SendStr As String
Dim Ret As String * 255
SendStr = "-r9 " & """" & FN & ".zip" & """" & " " & """" & pasu & "\" & """" & " " & """" & FN & ".bmp" & """"
Zip Me.hWnd, SendStr, Ret, 255
Retの数上げても意味ありませんでした。

VBのスレでも聞いてるんですが荒れてて答えかえって来そうに無いので
お願いします
124123:04/04/15 21:01
同じプログラムのなかでLzhに圧縮するのも書いてるんですが
そちらは98もXPも問題なく動いてます。
>>122
あぁ、それは確かに。ビットマップの項目が長いところとかね。
> SendStr = "-r9 " & """" & FN & ".zip" & """" & " " & """" & pasu & "\" & """" & " " & """" & FN & ".bmp" & """"
鳥肌が立つほど気持ち悪かった
127123:04/04/15 21:13
そう書かないとスペースありのフォルダ名とかくると
誤作動するんですよ、もっといい書き方ありそうですけど、、
初心者で申し訳ないです
>>126の部分がAAに見えたよ。コードにはどうしても見えない
>>123
zip32.dllはよくしらんが、-r9の後にスペースっていらんの?
Win32APIじゃねーだろ。
>>127
すれ違いだが...

Private Function DQ(Str As String) As String
 DQ = """" & Str & """"
End Function

SendStr = "-r9 " & DQ(FN & ".zip") & " " DQ(pasu & "\") & " " & DQ(FN & ".bmp")

とかするのは、どうだろうか ?
>>121
その指摘したの漏れだ・・・。思うに猫の中の人はBASICで論理構造がガチガチに固まってるんじゃないかと。
俺は「pasu」が気持ち悪いぞ。
134123:04/04/15 21:58
>>129
-9rの後にスペースありますし98だと正常に動きます。

>>131
なるほど〜

すれ違いな事にも気づきませんでした、すみません

>>133
passとかaddとかつけたいけどなんかだめな気がするんで、、

すれ違いなようなので去ります。
ご迷惑おかけしました
べーしっ君ですな
>>134
> passとか

... pasu の方がましかも...。
パス付きlzhってのがあるのかとおもたよ
pathのことかorz
ってzipの話か。
13972:04/04/15 23:26
>>83
遅レスごめんなさい
クリップっていうのはどういうことなんですか?
前々からWS_CLIPSIBLINGSの説明とかでもでてきたのですが
検索して調べても本文と照らし合わせて納得のいく
説明がしてあるのは見つかりませんでした・・
そしてこの

メインウィンドウ
┣子ウィンドウA
┗子ウィンドウB(スタティックスタイル)
 ┗ボタンやエディット

子ウィンドウ二つにはWS_CLIPSIBLINGSが設定してあります。
コレはただ 設定してないで同じ位置に配置した場合
一方の子ウィンドウ他方の子ウィンドウに描画を行ってしまうから
と 勝手に推測して設定したものでありますが
よくはわかってないで使ってます
ウィンドウ Zオーダー 色々な概念を
正確にイメージできていないような気がします・・

>>123
> Dim Ret As String * 255
> Zip Me.hWnd, SendStr, Ret, 255

Retも怪しいんですが。
本当はByte型のテーブルにして、実行後にSJIS→UNICODE(String)コンバートするんじゃないかと。
SetTimer で設定して呼ばれたタイマプロシージャ内で
そのタイマをKillTimerしても問題ありませんか?
142デフォルトの名無しさん:04/04/16 00:59
>>141
問題ありません。
つか、よくやることでしょう。
14378:04/04/16 04:11
>>79-81
ありがとうございます。
81さんのまったく仰るとおりなんでググって出直してきます。。。
動的に長さが変化する文字列の取得がしたかったんですが
string使うのかな・・・
てか↓逝きですなorz
http://pc5.2ch.net/test/read.cgi/tech/1054813207/l50
>>140
その辺の変換はVBがやってくれるよ。
>>143
文字列の長さを取得するwin32apiはlstrlen

勉強してらノシ
>>145
この場合はGetWindowTextLength(GetDlgItem(hDlg, IDTXT))だと思うが。
147145:04/04/16 10:26
元のカキコを読まずに脊髄でレスしちまった・・・orz

フォローサンクス>>146
windowsのUNICODEってUTF-8だよね?
>>148
UCS-2/UTF-16
>>149
サンクスコ
ついでにWideCharToMultiByte関数は現在のロケールのコードページに基づくMBCSに変換すんのかな?
コードページってキャラクタセットと同じ?
>>150
ぐぐれ。つかMSDNの説明読んだ上でそんな質問してるのか?
>>150
日本語( Shift_JIS ) は コードページ 932 だ。
WideCharToMultiByte( 932, (以下略) ); と指定するのだぞ。
>>152だとOSがどこの国で動いていてもシフトJISになるわけだが
それではまずい場合は
WideCharToMultiByte( CP_ACP, (以下略) );
まあMSDNを見れば一目瞭然なわけだが
>>139
まず、全ての標準コントロール (static を含む。NT系列では Comboを除く) は、CS_PARENTDC クラススタイルを
持っているので、描画は親ウィンドウのデバイスコンテキストにを用いて行われます。つまり描画について考える際には、
クリッピング領域とWM_PAINTの発行順だけを考慮すればOKです。デバイスコンテキストは共通だから。

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

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

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

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

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

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

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

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

長レス&超ド級初心者で申し訳ありません
助けてください_| ̄|○
158139:04/04/16 18:11
>>157
サンクス!!!
まだちょっとしかみてないけど
今の自分にぴったりかもしれません
見てみます
159デフォルトの名無しさん:04/04/16 18:38
win32APIにてアイコンの変更ダイアログを呼び出したいんですが
ググってもvbに関しての情報がなくつまってます・・・

誰か助けてくだされ
160159:04/04/16 18:43
事故解決でけますた
失礼
161159:04/04/16 18:44
>>160
お前誰だよ!まだ解決してねーよ!!
162159:04/04/16 18:47
>>161は偽物です。
つかそれはVBでWin32APIの使い方がわからないのか?ならVBスレで聞いてこい。
164159:04/04/16 18:54
>>163
うるせー馬鹿
165159:04/04/16 19:03
>>163
159&160は自分です。
使い方はもちろんのことわかっております。
検索しても情報が少なく、accessについてるやつ引っ張れそうなんで
"解決"判を押させてもらいました。

スレ汚しスマソ
>>165
どうやって解決した?
気になるじゃないか。
ならねーよ
168159:04/04/16 20:13
なれよ。
この時間帯は何とも香ばしいですな。
質問があったけどまた後で来まつ。ノシ
170159:04/04/16 20:17
>>166
解決といこうとしたんですが・・・
ちっと戦ってます。

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

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

ンデ戦ってます。
Dim strBuff As String
strBuff = StrConv("c:\winnt\explorer.exe" & vbNullChar, vbUnicode)
Call SHChangeIconDialog(Me.hWnd, strBuff, 0, 0)

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

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

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

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

>>175
誰もが一番最初に作るであろうウィンドウだけの何もしないプログラムです。
>>176
おまえのPCだけがおかしいんじゃないのか
ウィンドウだけのプログラムでそんなことにはならない。
178173:04/04/16 23:25
>>177
そうですね。どうもありがとうございました。
>>173

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

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

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

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

それで、

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

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

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

(リッチ)エディットコントロールについての質問なのですが、

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

より速度を求める場合は、ウィンドウに直接書く(TextOut)しかないのでしょうか?
リッチエディットより ということなら普通のエディットでもいいだろ
前スレ見てて不思議に思ったんだが
> 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コール体系を調べた上で書いているようだから
参考にはなるだろう。
>>184
あのね。標準関数というのは、その環境でちゃんと動くように作られてるんだよ。
>>184
WindowsというかVCのCRTも最終的にはCreateFileを呼んでるけど。
fopenはCの規格に含まれる関数であって、OSのそれじゃない。
ネイティブで実装しているOSがあるかもしれないけど、それは今関係無い。

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

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

183氏が

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

のは

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

のくだりに関してだから、ここでいう移植とはこういう意味である、という
事でああいう風に書いた。
元発言の主旨はなにか、という話なら多分あなたの言う事が正しいのだろう。
他スレからのコピペだけど、
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!
キタ━━━━(゚∀゚)━━━━!!
さよなら某ランド
IDEあるの?
配布制限あり、IDEなし
まだまだ某は生きると思われ
どんな配布制限?
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読めんのか。
>>193はインストールして読んだんだろ?どんな制限があったのか教えてクリ。
197デフォルトの名無しさん:04/04/17 15:52
NetBIOSでのワークグループ名やドメイン名を取得するAPIって何になるんでしょうか?
Windows 2000/XPについてです。

GetComputerObjectName かと思って試したんですが
ドメインに入っていないマシンだとERROR_CANT_ACCESS_DOMAIN_INFOという
エラーが出てしまいます。
>>191
コマンドラインベースだと某のコンパイラの方が使いやすい
商用アプリ不可、$5.0を超える手数料の徴収不可
えーご苦手ながら読んでみたけど、コンパイラはVC7.1(VS.NET2k3)のと同じなんだよね?
>>199
落として一通りEULAに目通してみたけど、
どこをどう読んだら「商用アプリ不可、$5.0を超える手数料の徴収不可 」になるんだ?
>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)は支払いませんよ」という話で、手数料がどーのこーのという話ではない。
配布制限に関しても「このソフト(Visual C++ Toolkit 2003)を無断で転載したら駄目」って感じなんだけど・・・
ここはちょっと英語力に自信が無いから微妙だけど
英語の読めないアンチが騒いでるだけだから放置しとけ
プ
ピ
207デフォルトの名無しさん:04/04/17 23:51
QueryPerformanceFrequency()でゼロが返される
ハードウェアが高分解能パフォーマンスカウンタをサポートしてない
PCってあるのでしょうか?
208デフォルトの名無しさん:04/04/18 00:00
>>207
rdtscをサポートしてないCPUだとおもう
pentium以降は大丈夫だろう
クロック可変のCPUで酷い目にあう悪寒
PCに搭載されているシリアルポート名を、例えば、COM1、COM2と言った
感じで列挙したいのですが、APIで実現できますでしょうか?

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

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

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

Win2000以降ならGetConsoleWindow()
225222:04/04/19 20:26
>>224
へたれwindowsなら強引にキャストすればいけるんでないかと思って・・・。

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

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

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

>>227
BitBltのフラグとかどう?
229216:04/04/19 22:55
>>228
有難うございます。
230227:04/04/19 23:07
>>228
BitBltにそれらしきものがありますね。
今まではStretchDIBitsで表示してたのですが、
それには無かったので、気がつきませんでした。
探してみます。ありがとうございました。
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
232デフォルトの名無しさん:04/04/20 02:25
以下のビットマップを表示するプログラムについての質問です。
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つ表示されるのに。
>231
Windowバージョンのdefineくらいは#includeの前にしてみなよ
234231:04/04/20 02:40
>>233

通りました。
理屈をよく考えてみれば当然そうでしたね(汗
どうもありがとうございました。
>>232
BeginPaintとEndPaint

あとは自分で考えれ
>>232
BeginPaint()が二度呼ばれるから、が原因だな。

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

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

>>236
詳しくありがとうございます。直してみます。
239232:04/04/20 04:19
あっ、そもそも大きな勘違いをしていました。
StretchDIBitsの時に表示していると思っていました。
TextOutと違い、ShowBitmapなどの名前でないのは、
その場で表示するわけではないからですね。
bigenPaint()したんだけどヘヤーカラーしか変わりません
>>240
そうなる仕様でつ。
242232:04/04/20 13:03
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を通るようにする)

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

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

で、「イベント」とはなんだ?
250246:04/04/20 19:01
>>247
SetPropとかすればいいんじゃに?

>>249
ウィンドウプロシージャがよばれるんだろ
251245:04/04/20 19:03
>>248
何ならできますか。

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

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

引数で送ったpath以外のディレクトリを参照で選ばれた場合の
pathをうけとる方法がわかりませぬ。

どなたかご教授願います。
254245:04/04/20 20:25
>>252
やっぱウィンドウが複数あったり、長編なプログラムは、
MFCとかで作るもんなんですかね。自分はMFCに挫折したくちでして。
SDKのみで作っている所で創プロはすごく参考になるのだけど、
やさしめのなので(それでも難しい)。
>>253
VBでいいのかな? 漏れの作ったのでよければ。

Private Declare Function SHChangeIconDialogA Lib "shell32" Alias "#62" (ByVal hWnd As Long, ByVal szFilename As String, ByVal Reserved As Long, lpIconIndex As Long) As Long
Private Declare Function SHChangeIconDialogW Lib "shell32" Alias "#62" (ByVal hWnd As Long, ByVal szFilename As Long, ByVal Reserved As Long, lpIconIndex As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Public Function ChangeIconDialog(ByVal hWnd As Long, strPath As String, Optional Iconidx As Long = 0) As Boolean
Const MAX_PATH As Long = 260
Dim strBuf As String * MAX_PATH, strRet(MAX_PATH) As Byte
Dim lPtr As Long, lRet As Long

strBuf = strPath & vbNullChar
If IsWinNT() Then           ←OSがNTかどうか判断。自分で作る
  lPtr = StrPtr(strBuf)
  lRet = SHChangeIconDialogW(hWnd, lPtr, MAX_PATH, Iconidx)
  CopyMemory strRet(0), ByVal lPtr, MAX_PATH
  strBuf = CStr(strRet)
Else
  lRet = SHChangeIconDialogA(hWnd, strBuf, MAX_PATH, Iconidx)
End If

If lRet Then
  ChangeIconDialog = True
  strPath = Left$(strBuf, InStr(strBuf, vbNullChar) - 1)
End If
End Function

呼ぶときは
Call ChangeIconDialog(Me.hWnd, パス, インデックス)
パス、インデックスに変更された値が戻ってくる。
256246:04/04/20 20:31
>>254
おまえ俺を馬鹿だと思ってるだろ
257デフォルトの名無しさん:04/04/20 20:32
MFCで無理なのにSDKで作れるって言うのはいったい・・・
WindowsXP sp1 Visual C++

Wininetを使った汎用的なクラス(class Internet)を作りたいんだけど、
アプリケーション定義コールバック関数とInternetSetStatusCallbackへ渡すコールバック関数を使うと
コンパイル時に「warning C4312: '型キャスト' : 'DWORD' からより大きいサイズの 'Internet *' へ変換します。」
と出て、実行するとハンドルされていない例外が出て止まってしまうんだけど問題なく動かす為にはどうしたいいんだろう?

こんな感じ
//アプリケーション定義コールバック関数
virtual void callback( DWORD dwStatus, LPVOID lpStatusInfo );

//InternetSetStatusCallbackへ渡すコールバック関数
static void CALLBACK _inet_callback( HINTERNET hInternet, DWORD dwContext, DWORD dwStatus, LPVOID lpStatusInfo, DWORD dwStatusInfoSize)
{
( (Internet*)dwContext )->callback( dwStatus, lpStatusInfo );
}
259245:04/04/20 20:51
>>256
とんでもございません。
>>247の書き方に失礼があったのならここでお詫び申し上げます。

>>257
使い方が分からないんです。猫のリソース・スクリプトも分かりません。
VBも挫折しました。ソースだけで作れるのでないと分からないです。
260デフォルトの名無しさん:04/04/20 20:55
>>259
じゃぁ、一緒にC#勉強しませんか?
割と良い感じですよ。
MFCの嫌だったところが全てなくなってる。
グローバル変数に記録しとけばいいだけの話だろ。
何を悩む必要があるんだ?

hWnd1 = CreateWindow();
hWnd2 = CreateWindow();

WndProc()
{
if (hWnd == hWnd1) {
...
}
else if (hWnd == hWnd2) {

}
}
糞プログラマが現れた
○戦う
○逃げる
263デフォルトの名無しさん:04/04/20 21:04
たぶん>>259さんはメッセージ駆動に慣れていないだけだと思うんですよね。
C#からはじめればばっちりですよ。
264159:04/04/20 21:07
>>255
VBでOKなんです。こちらの意図が完全にとおりました。
どうもありがとうございます。

ってかめちゃコード見やすい・・・見習わないと・・・
265245:04/04/20 21:08
>>260
C#ですか。どんな感じなのかいろいろ調べてみます。
ただ自分は、新しいのを覚えようとしないで、今ある知識で
工夫して何かを作ろうと考えてしまう所があって、
そのままSDKで作るかもしれませんが、その時はすいません。

>>261
グローバル変数はいけないという概念があって。WinMainは
スタートファイルだから、externとかしなくてもいいので
逆に使うことで困ることは無いと思うのですが。
よしここらでいっちょ指摘しとこう。
×教授 ○教示
267245:04/04/20 21:16
>>263
ええ、全然慣れていません。
ゲームを作ろうと思ったのですが、コンソールアプリでは
表現しきれないので、グラフィックを使いたいと思って、
勉強を始めました。昔少しやったことはあったのですが。
正直うざいだけです。PeekMessage+Sleepのメインループで
グルグルがいいのですが、勉強するチャンスでもあるのでやってます。

C#はいいんですかね。文章を読んだだけで2人の方が進めてくれたので
まさに自分にぴったしのなのかもしれません。
268デフォルトの名無しさん:04/04/20 21:17
きょうじゅ けう― 【教授】

(名)スル
(1)0 1 (ア)児童・生徒に知識・技能を与え、そこからさらに知識への興味を呼び起こすこと。
(イ)専門的な学問・技芸を教えること。
「国文学を―する」「書道―」
(2)0 大学などの高等教育機関において、専門の学問・技能を教え、また自らは研究に従事する人の職名。助教授・講師の上位。


いいんでない?
>>265
ならstaticにすればいいじゃない。
変数名直で書くのがいやならクラスメンバにするとか。
形体はなんであれ、スタック以外の領域に、なんらかの形で
ハンドルを覚えておかないと分岐のさせようがないのはわかるでしょ?
270245:04/04/20 21:41
>>269
そうですね。CheckHWNDみたいな関数があったとしても
もう片方の辺が無いから意味ないですし。
そういえば猫プロ(だっけ?)も始めに
char szClassNme[] = "ウィンドウクラス・ネーム" ;
みたいにWinMainの前にグローバル変数で書いてありますね。
もしや盲信的にグローバルは駄目といっているだけなのか?
272245:04/04/20 22:16
>>271
そうだと思います。
ただ、長編のときはグローバル関数をあまり使わないで、
カプセル化(だっけ?)した方がよかったりするように、
極力使わないほうがいいのは分かっています。
ただ、逆に使わないと大変な所は、無理せず使うようにします。
>>272
まーそれでいいんじゃない。事情がわからんので適当だけど
普通は>>261よりは>>251のアプローチだと思うよ
274デフォルトの名無しさん:04/04/20 23:09
すみません、質問させてください。

ウィンドウのタイトルバーの左側にあるアイコンを動的に設定する方法ってありますか?
今、
hIcon = LoadImage(hInstance, MAKEINTRESOURCE(IDI_ICON), IMAGE_ICON, 0, 0, LR_CREATEDIBSECTION);
DrawIcon(GetDC(hWnd), 0, 0, hIcon);
などとやっていたんですが、
これはアイコンの設定ではなくて描画ですよね……。

WNDCLASS を毎回 RegisterClass() して対処しようかとも思ったのですが、
直前に RegisterClass() した時の WNDCLASS を取得する方法もわかりませんでした。

何か解決策はありませんか?
>>274
WM_SETICON
>>274
WM_GETICON?
今C#いじってるけど、想像より実行が速いんで驚いてるよ。
ただ、俺のやり方が悪いんだろうが、すぐAPIが恋しくなってDllImport使いまくってる。
278274:04/04/20 23:17
>>275
おお! あっさりできました!
ありがとうございます!

>>276
おはようございます。
>>277
.NET Frameworkのメモリ馬鹿食いはきにならない?酷すぎるんで結局W32APIに戻ってきたよ
>>277
実行中の重さは(GUI使わなければ)気になることはないね。
.NET Frameworkでアプリのローカライズをやっちゃうと、
他の開発環境に戻りたくなくなってしまいますた。
282258:04/04/21 00:04
>>258の現象はvirtualをつけるとなるみたいです。
virtualをつけても大丈夫な方法はあるんでしょうか?
>>279
元々でかくなるプログラムを書いてるんで、メモリ消費量は気にならない。
むしろ今は、未知の言語を触っているという楽しさがあるので、
使い慣れてきたら気になってくるかもしれんけどね。
284デフォルトの名無しさん:04/04/21 00:44
>>277
実行は早いね。
メモリーが気になるのも同意。
マイクロソフトがこれを主流にする気みたいだから、
これで行っても大丈夫だろうとは思う。
285デフォルトの名無しさん:04/04/21 04:32
Cでやってるんですけど、MIDI再生ができませぇん。
コンパイルはできるけど、音がでない・・・OTZ

http://www.users.yun.co.jp/~studiowing/win32api/win-17.htm
ここの使ってるんですけど、何か注意する事とかありますか?
えらく大雑把なサンプルだなw
まあそれは良いとして、mciSendString の戻り値は確認したのか?
それなりのエラーコードが返ってるんじゃないか?
Windowsアプリケーションでコマンドライン引数を取得する処理を
自前でやってるので大変です。
main関数を使ったときのargc, argvみたいに
簡単に取り出せるAPIはないですか?
__argc __argvじゃいかんの?
>>288
おぉ。そういうのがあったのですか。
調べてみます。ありがとうございます。
__argc, __argvだっけ?
リロード忘れてた(鬱
>>290
うん。

>>291
(,,゚Д゚) ガンガレ!
29354:04/04/21 11:07
>>56-58
ありがとん。返事が遅くなってスマソ。

>>58さんのGDI+で問題解決しました。
ttp://www.kumei.ne.jp/c_lang/sdk4/sdk_336.htm
>>285
MIDIファイルの位置が悪いとか……
実行ファイルのあるフォルダにMIDIをおいて、VSを使わずに直接実行してみても駄目?
295232:04/04/21 23:23
>>232です。
ビットマップを普通に表示するのは分かってきたのですが、
透過の仕方がわかりません。調べるとマスクとか書いてあるのですが分かりません。
以下のプログラムなら、どう発展させていけばいいのでしょうか。
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1060403548&res=61&fi=no
296232:04/04/21 23:33
>>295
すいません。ShowBitmap関数のStretchDIBitsの最後の引数を
dwRopに変更してください。

後、実はその変更を行った後、たまたま人(前景)のほうの引数を
SRCANDにしたら透過できてしまいました。
SRCANDは「論理 AND 演算子を使って、コピー元の色とコピー先の色を
組み合わせます。」らしいのですが、なぜ透過できたのでしょうか。
297デフォルトの名無しさん:04/04/22 02:48
今日は、Charles Petzoldの刺青に萌えました・・・
ttp://www.charlespetzold.com/
298232:04/04/22 03:17
すいません。>>295-296は人が黒のみだからうまく出来てたようです。
いろいろ調べていましたが分からないので、
1ピクセルずつ調べながら透過しない位置をGetPixelとかで
描画する方法でやってみます。お騒がせしました。
>>298
そこでなんで"たまたま"成功したかを追求すれば正解があるんだが。
300232:04/04/22 05:37
>>299
自分はウィンドウズの基礎がなってないので難しいです。

一応>>298の方法で256色のはできました。
ただintのカウンタとforを使って普通にやっているので
表示するサイズが大きくなるとかなり遅そう。
>>298

1ピクセルずつやる、というのは妥当な方法だけど(マスク作るよりは楽)
それをやるならビットマップのメモリデバイスコンテキストに対してでは
なくDIBピクセル列に対して行うべきだね(DIBの操作は単純なメモリアク
セスなので、処理が圧倒的に早く正確)。

性能的には32ビットDIBで数百×数百ピクセルのビットマップを透過処理
しても、特に問題はない。
>>300
> ただintのカウンタとforを使って普通にやっているので
> 表示するサイズが大きくなるとかなり遅そう。

そういうもんです。
あとは、GetPixelみたいに1ピクセルごとに計算するのではなく、301さんが言うような方法で
メモリ上に展開することでループ計算や関数呼び出しのフィードバックを省略したり、
直接アセンブラをいじってMMXやSSEを呼び出し、数ピクセル分を一気に計算したりすることで
高速化を図ったりする。
303デフォルトの名無しさん:04/04/22 10:40
斜体フォント文字の表示長方形領域を取得したいのですが、
DrawText(hDC, str, -1, &rect, DT_CALCRECT);
では、通常フォント文字の表示長方形領域を返してきます。

斜体フォント文字の表示長方形領域を正確に取得する方法をご存知の方、
教えていただけないでしょうか?
304232:04/04/22 10:53
>>301>>302
以下を>>295のプログラムのStretchDIBitsを消して
その位置に加えれば透過描画が出来ます。(8ビットのみ)
透過の位置はビットマップの左上と同じ色の位置です。
どこを直すといいでしょうか。
if(bmpInfo->bmiHeader.biBitCount == 8) //256色ビットマップ
{
int i ;
int updw = bmpInfo->bmiHeader.biHeight > 0 ? 1 : -1; //up,downどっちの方式か
int sizeX = bmpInfo->bmiHeader.biWidth; //サイズx
int sizeY = abs(bmpInfo->bmiHeader.biHeight); //サイズy
int dot = sizeY * sizeX; //ドット数
int p; //パレットの種類
int x, y; //拡大をしない表示する位置
int x2, y2; //拡大の分
int touka = updw > 0 ? lpBMP[dot - sizeX] : lpBMP[0]; //透過する色のパレットの位置
for(i = 0; i < dot; i++)
{
p = lpBMP[i];
if(touka == p)continue; //透過する位置
x = (spotX + i % sizeX) * bairituX;
y = (updw > 0 ? spotY + sizeY - i / sizeY - 1 : spotY + i / sizeY) * bairituY;
for(x2 = 0; x2 < bairituX; x2++)for(y2 = 0; y2 < bairituY; y2++)
SetPixelV(hdc, x + x2, y + y2,
RGB(bmpInfo->bmiColors[p].rgbRed, bmpInfo->bmiColors[p].rgbGreen,
bmpInfo->bmiColors[p].rgbBlue)); }}
>>303
GetTextExtentPoint32はどう?
306303:04/04/22 11:47
>>305
ダメでした。
DrawText(hDC, str, -1, &rect, DT_CALCRECT);
と同じ結果でした。
>>306
hDCにフォントの指定はしてあるよね…?
308306:04/04/22 13:12
>>307
指定してます。
OldFont = (HFONT)SelectObject(g_mem.hSzDC, hfont);

ワードパッドで斜体文字を表示して、選択で色を反転した時にわかる領域サイズと
同サイズが返ってきていると思われます。
Win32APIでは、斜体文字の表示範囲を取得するのは無理なのでは?
と思いはじめています。
>> 308
私もやり方を知らない。
それらプラス tmOverhang が助けにならないのは知ってる。
GetCharABCWidths, GetCharWidth32, GetCharPlacement, GetGlyphOutline
あたりはためしてみた?
310 ◆IGEMrmvKLI :04/04/22 16:34
VBからAPIをコールしています。
InternetConnectをコールしているのですが、そのあと、アプリケーション終了時に
応答が帰ってこなくなることがあります。
マシンによって違い、アプリケーション終了後、正常終了して普通に終わるマシンと
アプリケーション終了後、正常終了して、タスクに応答なしで残りつづけるもの。

InternetConnect関数コール直後、デバッカによる停止で上記事象が発生するので、
そのあたりだとは思うのですが、OSによっての違いでもないみたいですし。

環境は、VB6.0SP5
Window2000 SP4
です。

応答が帰ってこない事象は、今のところ、Win2kSP3とSP4で確認しています。
逆に、通常に終わる場合は、WinXP・Win2kSP3・SP4・WinNTなどで確認しています。

原因について、思い当たるような節のあるかた、いらっしゃいましたらご教示よろしくお願いします。
311デフォルトの名無しさん:04/04/22 17:02
>>310
で、結局Win2kSP3・SP4ではどういう挙動を示すんだ?
312310 ◆IGEMrmvKLI :04/04/22 18:28
すいません。解決しました。
Win2kSP3・SP4の場合、タスクマネージャーに応答なしアプリケーションとして、
30秒程度?居残りつづける状態でした。

原因ですが、FTPサーバへのログインにAnonymousを使用していると、
同様の事象が発生するようです。
ほかのユーザを切りなおしてそのユーザでログインすると、その事象は解決しました。

どうも、ご迷惑をおかけしました。
313デフォルトの名無しさん:04/04/22 23:05
プロセスハンドルからプロセスIDって取れませんか?
ShellExecuteEXでプロセスハンドルしか帰ってこないんです。
>>313
GetProcessId()でいいんじゃないの。
XP sp1 以降なら。
>>313
CreateProcessを使うとプロセスIDを取得出来るねぇ。
316デフォルトの名無しさん:04/04/23 04:11
>>313
GetWindowThreadProcessIdというのもあるよ。参考までに。
317313:04/04/23 22:53
>>314
XP sp1以降ということは、それ以前では感嘆には取れないんでしょうか?

>>315
データファイルを関連付けアプリで起動したいので、ShellExecute(EX)が
いいんです。
CreateProcessだとEXE直接起動オンリーですよね。FindExecutableで
さがせますけど、openのほかにprintとか他のverbもサポートしないと
いけないかも、なのでレジストリ直読みして環境変数置き換えて・・・・
マンドクセ

>>316
それだとウィンドウハンドルがわかんないといけないですけど、
プロセスハンドルからそのプロセスのウィンドウハンドルって取れます?
プロセスIDが分かっているときにウィンドウハンドルをとるなら
EnumWindowsとGetWindowThreadProcessIdで出来るんですが・・・
そのプロセスIDがわからんわけです。
この辺が参考になるかな。

ttp://search.acty-net.ne.jp/mfc_search/archive/2001-1/msg03531.html

プロセスハンドルはシステム内で一意な値じゃないからそこから
プロセスIDを特定することは出来ないってことじゃないかな。

手間を惜しまないのなら、SetWindowsHookExかCreateRemoteThreadで
対象プロセスに自作のルーチンを進入させてGetCurrentProcessIdする手が
あるけど。
NtQueryInformationProcess
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/ntqueryinformationprocess.asp

Windows2000 と WindowsXP (SP適用前) の場合限定で使えるんでない?
WindowsXP SP1 以降は GetProcessId() を使う方向で。
WindowsMe 以前は諦め…
>>319
9xでは構造体を直接読むという荒業が使えると思われ
どうせ9xはdisconなのだから将来の互換性の問題は気にする必要ないし
321デフォルトの名無しさん:04/04/24 09:38
キャレットの表示にCaret系使うのと自分でInvertRectとかで描くのと何が違うんですか?
CreateToolhelp32Snapshotでどう?
で、便乗して質問なんだけど、SetWindowsHookExで全スレッドにフック取り付ける場合、
data_segとか使って全DLLで同じメモリ領域(HHOOKとか)を参照するようにしますよね?
でもそうすると、SetWindowsHookExを複数回呼ばれた場合に、
つまりSetWindowsHookExを含むDLLが複数のプロセスで呼び出された場合、
重複したフックが設定されてしまう可能性があります。

また、肝心のフック関数は処理結果を指定されたウィンドウハンドルに送るわけですが、
上記DLLを排他処理した場合、1つのウィンドウハンドルにしか送れなくなってしまいます。

これら問題を上手く解決する方法はないものでしょうか?

つまり、
SetWindowsHooExを呼び出す関数は、どのタイミングでどのプロセスから呼び出されても、
安全・確実に実行する事が出来き、かつその全ての呼び出し元が要求したウィンドウハンドルに、
全ての呼び出し元が開放を要求するまで、フック関数からのメッセージが確実に送信される、
というふうにしたいのです。
どっかでも以前議論してたが、フックハンドルを共有メモリ領域に置く必要は無かった筈
>>325
すみません。"フックハンドル 共有メモリ"でググってみましたが、見つかりませんでした。
共有メモリ領域を使わない方法とはどのようなものなのでしょうか?
327デフォルトの名無しさん:04/04/24 11:56
http://pc.2ch.net/tech/kako/991/991576947.html
にそれらしきレスがありますが、
CallNextHookExにNULLを渡すというのはソースが見つかりませんでした。
>>325
それでも一応動くけど
CallNextHookExで正しいフックハンドルを渡さないと環境によってはシステム自体が著しく不調になる
329324:04/04/24 14:31
現在のソースはこんな感じ:
HANDLE hMutex = NULL;

hMutex = ::CreateMutex( NULL, TRUE, SYSTEM_HOOK_MUTEX_NAME );
if ( hMutex == NULL ) {
// exception
}

if (::GetLastError() == ERROR_ALREADY_EXISTS) {
DWORDdwWaitResult;

dwWaitResult = ::WaitForSingleObject( hMutex, 1000 );

if (dwWaitResult != WAIT_OBJECT_0) {
// exception
}

}

g_hMouseHook = ::SetWindowsHookEx(
WH_MOUSE,
(HOOKPROC)g_MouseProc,
hinstDLL,
0
);

if (g_hMouseHook == NULL) {
// exception
}

::ReleaseMutex( hMutex );
>>329を見たら腹が痛くなってきた
俺はどっちかっていうと腹が減ってきた
俺なんて最近腹が出てきた
つまんねーレスに腹がたってきた
はらたいらさんに1000点
同じグローバルフックを複数使う理由がわからん
336324:04/04/24 18:50
>>335
フックを使用するプログラムが、
ユーザ意思によって多重起動される可能性がある場合。
>>336
その場合フックハンドルを共有したらまずいじゃないか
>>337
RegisterWindowMessageをしてブロードキャストするか、
ウィンドウハンドルだけ配列にしようかと・・・

もっと良い方法ありますか?
339デフォルトの名無しさん:04/04/24 21:37
根本的に勘違いしているな。
SetWindowsHookExの第4引数を0にした場合は、起動中の全てのスレッドに
フックをかけるだけでなく、SetWindowsHookEx呼び出し後に起動したスレッドに
対しても、システムが勝手にフックをかけてくれるようになる。
あなたが考えるべきことは、多重起動されたときにSetWindowsHookExを
複数回呼び出すことではなく、多重起動されても1回しか呼び出さないことだ。
書きかけで送信しちゃった、スマン。
要するにこういう風にすりゃいいだろ、って事だ。

HHOOK g_hMouseHook = NULL;


HANDLE hMutex = NULL;
hMutex = ::CreateMutex( NULL, TRUE, SYSTEM_HOOK_MUTEX_NAME );
if ( hMutex == NULL ) {
// exception
}

if (g_hMouseHook == NULL) {
g_hMouseHook = ::SetWindowsHookEx(
WH_MOUSE,
(HOOKPROC)g_MouseProc,
hinstDLL,
0
);

if (g_hMouseHook == NULL) {
// exception
}
}
::ReleaseMutex( hMutex );
多重起動しても一回しかSetWindowsHookExしないように
Mutex用意してあるんでしょ?











ってことで解決なのかそうでないのかはよく知りません
>>341
ソースをよく読め。
Mutexの作成に失敗した場合でもエラーコードがERROR_ALREADY_EXISTSの
場合(Mutexをすでに作成済みというエラー)はSetWindowsHookExの呼び出しに
行っちゃってるだろ。
343313:04/04/24 23:07
>>318-320
むう、わかりましら。
レジストリ直読みでなんとなく出来てるんですが、APIがあるならそっちで
逝ってみます。
>>342
ソースうんぬん言う前に投稿時間をみろよ
>>344
342じゃなくて329のことだよ。
>>343
9xでもパフォーマンスデータのレジストリってあったっけ?
>342
WaitForSingleObject

>324
とりあえず SetWindowsHookEx() を呼ぶ関数は DLL 内にあるという解釈でいい?
で、>339 の言うとおり SetWindowsHookEx() 自体は全体で 1回だけ呼べばいい。
後は、>338 で自分でもいってる通り、呼び出し元のウィンドウハンドルの管理をする。
登録関数で追加、解放関数で削除、フック内部ではリストを見ながらメッセージ送信すれば OK かと。
>>339-342
SetWindowsHookEx自体は1回だけ呼び出すようにするつもりです。
元のソースは書きかけだったもので・・・お手数おかけしました。

>>347

こんな感じでいいんでしょうか?

bool g_InstallHook( HMODULE hModule, HWND hwndNew ) {
HANDLEhMutex = NULL;
boolresult;

hMutex = ::CreateMutex( NULL, TRUE, SYSTEM_HOOK_MUTEX_NAME );
if ( hMutex == NULL ) return false;// fatal error

if (::GetLastError() == ERROR_ALREADY_EXISTS) {
DWORDdwWaitResult;

dwWaitResult = ::WaitForSingleObject( hMutex, 1000 );

if (dwWaitResult != WAIT_OBJECT_0) return false;// fatal timeout

}

if (g_hMouseHook == NULL) {
g_hMouseHook = (HHOOK)::SetWindowsHookEx(
WH_MOUSE, (HOOKPROC)g_MouseProc, hModule, 0
);
}
if (g_hMouseHook == NULL) result=false;// hook failed
else {
HWND*newWndList = NULL;

newWndList = (HWND*)GlobalAlloc( 0, sizeof(HWND)*(g_WndCount+1) );

if (newWndList == NULL) result=false;// hook succeeded even here
else {

CopyMemory( newWndList, g_WndList, sizeof(HWND)*g_WndCount );

newWndList[g_WndCount] = hwndNew;

g_WndList = newWndList;

result=true;
}
}

::CloseHandle( hMutex );

return result;
}
C#からW32APIって呼べますか?
呼べます
ありがとうございます。呼べると分かればあとはどうにか調べます。
>>348
・g_WndCount のインクリメントが抜けてる
・GlobalAlloc で確保したメモリはプロセス間共有されないのでフック内で使えない。
 共有領域に固定長で確保するか、FileMapping を使う。
 ただし、FileMapping 使うとプロセスごとに MapViewOfFile しなきゃいけないし、
 本当に動的にするのはかなり厳しいと思われ。不可能じゃないとは思うけど。
 適当に最大値決めて仕様にするのはどうよ?

後、個人的には毎回毎回動的メモリの拡張をやるのはあまり好きじゃないがその辺は趣味の問題だな。
>>353
レスありがとう。
こんな感じにしますた。
ウィンドウへの通知はブロードキャストに。


if (g_hMouseHook == NULL) result=false;// hook failed
else g_WndCount++;

::CloseHandle( hMutex );

return result;
}
bool g_UnInstallHook( HWND hwnd ) {
HANDLEhMutex = NULL;

hMutex = ::CreateMutex( NULL, TRUE, SYSTEM_HOOK_MUTEX_NAME );
if ( hMutex == NULL ) return false;// fatal error

if (::GetLastError() == ERROR_ALREADY_EXISTS) {
g_InstallHookと同じなので略
}

g_WndCount--;

if (g_WndCount <= 0) {

::UnhookWindowsHookEx( g_hMouseHook );

g_hMouseHook = NULL;
}

::CloseHandle( hMutex );

}
356デフォルトの名無しさん:04/04/25 23:34
CreateProcessWithLogonW で起動した子プロセスの標準入出力を
親プロセスのパイプにつなげてやりたいのですが、CreateProcess の
bInheritHandles に相当するものがないので、パイプハンドルを継承
させることができません。
なにかうまい方法はないもんでしょうか。
対象OSは2000以降です。
>>354
もはや API の話でもなんでもないが、デクリメント前に g_WndCount が 0 以下なら即 return した方が
安全なんじゃないだろうか。
基本的にないケースだとは言え、UnhookWindowsHookEx() に NULL 渡しても大丈夫だろうかとか
余計な不安が消える。
CreateProcessAsUserでも使えば?
359デフォルトの名無しさん:04/04/26 00:11
あるソフトのWS_POPUPスタイルのウインドウをタイトルバー付きのウインドウに変更したいのですが
SetWindowLongは他のプロセスのウインドウに使えないので、他に何かいい方法はないでしょうか?
検索してもフックする方法しか見つからないのですが、他に方法無いですかね?
スクリプト言語使ってるので、DLL作るのは面倒なんです。
まずはSetWindowLongに関する認識を改めたほうが良い
361356:04/04/26 00:19
>>358
すいません。親プロセスは一般プロセスなので LogonUser が使えないんです。
>>361
CreateProcessWithLogonWを使ったとき実際に子プロセスを
起動しているのはRunAsサービスなのでどうしようもない
>>357
了解しました。
よく考えたらg_UnInstallを複数回呼び出した後で、
g_Installとg_UnInstallの組み合わせを複数回呼び出すと・・・
364デフォルトの名無しさん:04/04/26 17:29
>>360
どういうことですか?
ドラッグ&ドロップハンドル用のHDROPがMSDNに書かれておらず、MinGWのヘッダにも無いのですが
HANDLE型で代用してよいのでしょうか?
猫によると実体は同じ物のようなのですが・・・。http://www.kumei.ne.jp/c_lang/sdk2/sdk_105.htm
>>365
少なくとも、Platform SDK Documentationには書いてありました。>HDROP
>>366
ありがとうございます。
shellapi.hの中を捜してみるとMinGW側でもちゃんと宣言されていました。
自分の書いたコード側の問題のようなのでそちら側で調べてみます。
原因がわかりました。Cの原則を忘れてswitch〜case内で変数宣言してましたorz
Cでも{}で括れば変数宣言できるだろ。
370デフォルトの名無しさん:04/04/26 21:29
コンソールアプリでBASICで言うところのLOCATEに相当するAPIって何でしたっけ?
なんか有ったと思いましたが再発見できず・・・。
SetConsoleCursorPosition?
372デフォルトの名無しさん:04/04/26 21:50
与えられた文字列がフォルダかファイルへの形式的に正確なパスかどうかを判定するのはどうやりますか?
373デフォルトの名無しさん:04/04/26 21:51
>>371
ですね、有難うございました。
そーか、猫のページで見たんだ。
>>372
そんなAPIあったな。
Path〜系のであったと思う。
>>372
MASAPICOでぐぐれ
377デフォルトの名無しさん:04/04/27 03:19
win32アプリでWinMainでreturn msg.wParamと終了するのではなく、
他の潜り先でGetMessageの戻り値が0以下の時にexit(msg.wParam);
ではダメなのでしょうか。
378377:04/04/27 04:07
>>377
すいません。自己解決しました。
フォントについて教えてください。
以下のようにコーディングしているのですが
出力されるフォントが普通の明朝体のようなフォントで
出力されてしまいます。どこがまずいのでしょうか?

hFont = CreateFont(25,
0,
0,
0,
FW_BOLD,
FALSE,
FALSE,
0,
SHIFTJIS_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH,
"Comic Sans MS");
明朝体になったのはもしや全角文字?
381379:04/04/27 10:40
>>380
半角文字です。出力はTextOutで行っています。
とりあえず、気になったのは
CharSetをANSI_CHARSETにしてないのと、
ちゃんとDCに関連付けてるかどうか
383379:04/04/27 10:52
>>382
べりーさんくすです。
ANSI_CHARSETにしたら丸っこい字になりました。
ほんとうにありがとうございました。
自分でパラメータを組み立てないでEnumFontFamiliesExで
帰ってきたものをCreateFontIndirectに渡すか
GetStockObjectを使うのが鉄則
どうしても自分で組み立てる必要があるときは
フォント名よりcharsetの指定のほうが優先度が高いことを
押さえとけ
一歩遅かった_| ̄|○
386379:04/04/27 10:59
>>384
なるほどー
勉強します。
387デフォルトの名無しさん:04/04/27 14:46
はじめまして。
任意のフォルダをクリックするとそのフルパスを表示するようなものを
作りたいと思っています。
フックをかけて処理を行おうと思っているのですが、
肝心のフルパスを取得する方法が分かりません。
何かよい方法がありましたらよろしくご教授お願いします。

> 任意のフォルダをクリックする

「フォルダをクリック」の意味が不明
>>387
explorer.exeの各フォルダウィンドウで、
ファイル・フォルダを表示しているSysListViewで
WM_LBUTTONDOWNが発生した時に、
カーソルの下にあるファイルのパスを表示したいって事?
390387:04/04/27 16:14
文章が分かりにくくてすみませんでした。
389さんの通りです。
"フォルダアイコンにマウスカーソルを合わせるとフルパスを表示する"
ならShell Extension書けば終わると思うが。
そもそも表示すると言ってもどこに表示するのやら。
Explorerのオプションでタイトルバーに表示できますね。win2000
394387:04/04/27 16:47
Shell Extensionですね。
知らない言葉なので調べてきます。
ありがとうございました。

マウスでサイズ変更可能な子ウィンドウがあり、
親ウィンドウより大きなサイズにまで変更可能にしたいのですが、
どのようにしたら良いのでしょうか?

WM_GETMINMAXINFO で ptMaxSize と ptMaxTrackSize に大きな値を設定しても
サイズ変更枠のドラッグ中に、
親ウィンドウの外までカーソルを移動させることがでませんでした。

よろしく願いします。
>>395
ウィンドウスタイルを見直してみな。
>>396
解答ありがとうございます。

早速、Spy++で親ウインドウの外まで広げられるウインドウと
広げられないウインドウのスタイルを
比較しようと思ったのですが、
手元にあるアプリケーション(DF,VC6等)は全て広げられず、比較することができませんでした。

MSDNを見ても、それらしいスタイルが見つからないのですが、
具体的にどのスタイルが必要なのか教えて頂けないでしょうか?
>>397
CreateWindowでどんな指定をしているか見せて
ポップアップウィンドウ>>(超えられない壁)>>チャイルドウィンドウ
400395:04/04/28 01:30
>>398
HWND hWnd=CreateWindow(
  szWindowClass, szTitle, WS_CHILD | WS_SIZEBOX | WS_VISIBLE,
  100, 100, 100, 100, hWndParent, NULL, hInstance, NULL);

各変数は VC7.1 の Win32 プロジェクトウィザードで作成された物をそのまま使用しています。

>>399
子ウィンドウが必要なのでWS_POPUPを付けるわけにはいかないんです。
>>400
WS_CHILDを外すしかない。
WS_CHILDをつけなければいいだけで、
子ウインドウに出来ないというわけではない。
それとも、WS_CHILDが必要なの?
メインのウィンドウとWS_CHILDではない子ウィンドウがあるとして、
例えばモーダルなダイアログボックスを表示したときに、
子ウィンドウがEnableなままというような事は発生するんだが、
こういうのはどうにでもなるしなあ。。。なんだろ?
割り込んで申し訳ないが、質問させてくれ。
「画面のプロパティ」ダイアログの「デザイン」タブみたいな事をしたいんだけど、
やはり、GetSysColorとかGetThemeとか使って、ちまちまやるしかないの?
それとも便利な関数とかある?
DrawFrameControlとか?
>>405
確かにボタン類やスクロールバーはそれで良いんですが、
それだと、タイトルバー等が描画できなくないですか?

また、XPのビジュアルスタイルにも対応したいのですが、
GetTheme等を用いなくても、たとえばウィンドウスタイルだけ渡したら、
その通りに描画してくれる関数・・・なんてのは無いですか?
uxtheme(.dll)でMSDN調べる
408404:04/04/28 11:47
>>407
いや、ビジュアルスタイルの場合は、
各種関数用意されてて簡単なんだよ・・・

問題は、2000とか9x系での話で、
DrawEdgeやらDrawCaptionやら使うしか無いのか・・・と。
409デフォルトの名無しさん:04/04/28 11:54
特定のネットワークアダプタのIPアドレス等の値を
設定するAPIを探しているのですが、探し方が
悪いようで一向に見つかりません。

どなたかご存じないですか?
よろしくお願いします。
410404:04/04/28 11:54
正規の方法では設定を調べつつDrawCaptionだのを組み合わせるしかないだろうな
あとはサブクラス化あたりでOSにむりやり描画させるか
>>402-403
WS_CHILDを持たないウィンドウは「所有されたウィンドウ」であって
「子ウィンドウ」ではない(少なくともMSDNの定義では)。
413デフォルトの名無しさん:04/04/28 13:55
リッチエディットコントロールの行間を詰める方法を教えていただきたいのですが、

「こんな風に

行間が空いて

表示されて

みっともないので...」

よろしくお願いします。
414myPrintf() user:04/04/28 14:50
Edit_ReplaceSel() でC文字列を送り込んだことしかないが、
どうやって表示しているかがわからないと...
415413:04/04/28 15:09
>>414
エディットコントロールは指定したフォントの高さ=行の高さで処理されるのですが、
リッチエディットコントロールで同じフォントを使用した場合、
フォントの上下に少し隙間ができて>>413のように表示されてしまいます。
CHARFORMAT以外にもいろいろ指定しないと駄目なのでしょうか?
行間は設定できないはず。
スレの趣旨とは少し外れるかもしれませんが質問させてください。
ダイアログやメニューはリソーススクリプトを書いて読み込ませることも、自分でCreateWindow(Ex)でガリガリ書く事も出来ますよね。
コンパイル後に外部からResourceHacker等でいじりやすくしようと思うとこれらを極力リソーススクリプトに追い出すべきかと
思っているのですが、保守性等の面でどちらが有利なのかは経験が浅いので良く分かっていません。

皆さんはこの二つの方法をどのように使い分けてらっしゃるんでしょうか?
>>417
ダイアログエディタ使わないの?
rc変更するだけで配置を変えられるので、rcのほうがお手軽でしょ。
>>418
使ってないんです。。多国語対応等も考えるとやはりリソーススクリプトに追い出した方がよさそうですね。
ありがとうございます。
>>417

配置する部品が多い、特にボタンやテキストボックスなどをグリッド状
に配置するような場合は自分でCreateWindowする。こうしておけば、配置
処理を書き換えるだけで簡単に配置を変更できる上に動的な位置・サイズ
変更もやりやすいからね。
421デフォルトの名無しさん:04/04/28 17:08
>>411
非表示ウィンドウを作ってWM_PRINTでOSに書かせるのが簡単では?
>>413
Win98のrichedit32.dllをコピーすると詰まります
検索すると配布しているサイトも見つかったはずです
423413:04/04/28 18:26
>>422
有難うございます、見事に詰まりました。感謝です。

C++でWin32APIプログラミングをする際にはどのような事に気をつけるべきですか?
くだらない質問をしないように気をつけるべき。
426デフォルトの名無しさん:04/04/28 20:08
>>425
くだらねーレス付けてんじゃねーよ、市ねボケ!
くだらない煽りをしないように気をつけるべき。
>>424
ウィンドウプロシージャとしてメンバ関数を登録したい
というFAQ中のFAQを質問しないこと。
CMyWindowClass::WndProcをウィンドウプロシージャにしたいんですが、どうしたらいいんですか?
430デフォルトの名無しさん:04/04/28 23:35
VC6でダイアログベースのアプリを作っています。
どのコントロールにフォーカスが移っても
IMEの入力モードを直接入力に強制的に固定したいのですが
どのようにすれば実現できますか?

また似たような質問になりますが、全角モードで入力されてもIMEを通さずに直接入力されたように
扱いたいのですが、どのようにすればよいでしょうか?

よろしくお願いします。
IME操作のAPIをチェックしてから言え馬鹿
432デフォルトの名無しさん:04/04/29 01:01
コンボボックスの入力エリアに入力されたキーメッセージを
感知・処理するため、処理の行き掛り上、コンボボックスの
CB_GETDROPPEDSTATEがきた時に次の関数を呼び出していますが
いまいち不安定です。
どうすればよろしいでしょうか?

void func(){  
 MSG   msg;
 HWND ComboEditHandle = ::GetWindow(ComboHandle,GW_CHILD);
 if(ComboEditHandle==NULL)
    return;
 ::GetMessage(&msg,ComboEditHandle,0,0);

  switch(LOWORD(msg.wParam)){
    case VK_RETURN:
       ::SendMessage(ComboHandle,WM_KEYDOWN,VK_RETURN,0);
       break;
    case VK_LEFT:
       ::SendMessage(ComboHandle,WM_KEYDOWN,VK_LEFT,0);
       break;
    case VK_RIGHT:
       ::SendMessage(ComboHandle,WM_KEYDOWN,VK_RIGHT,0);
       break;
    case VK_UP:
       ::SendMessage(ComboHandle,WM_KEYDOWN,VK_UP,0);
       break;
    case VK_DOWN:
       ::SendMessage(ComboHandle,WM_KEYDOWN,VK_DOWN,0);
       break;
 }
}
>>432
サブクラス化してるの?
434デフォルトの名無しさん:04/04/29 01:16
ちょっと根本的なことで疑問に思ったんだけど、
APIを呼び出すって事は各APIごとに決められたアドレスにジャンプさせること
っていう認識でいい?
API群は起動時に全てメモリに読み込まれるのかな。
お前沢村だろ?
Win32 APIの実体は単なるDLLからexportされた関数。
それ以上でもそれ以下でもない。
VBのプロパティ入力コントロールの作るには、どのAPIを利用すればよいのでしょうか?
HTMLのタグエディタを予定しています。
>>437
いっぱい
>>438
いやいや・・・、微妙に突っ込み方がわからなくてすみません。
>>437
CreateWindow()
441デフォルトの名無しさん:04/04/29 04:01
特定のソフトのメモリを書き換えるソフトを作っているのですが、
"WriteProcessMemory"のアドレスと書き換えるデータの型指定が分かりません。
プロセスの取得までは出来たのですが、どうにも分かりません。
どうか教えてもらえませんでしょうか?
442myPrintf() user:04/04/29 08:10
>>422-423
「猫でもわかる...」の説明通りにやっていると、win98 VC++ 6.0 で作った
application で、winXP でも、行間は詰まって表示されているが、これは
どういうことかなあ。フォント設定とか付けてレジストリ記憶です。
443デフォルトの名無しさん:04/04/29 09:10
>>409
もしかして、これって不可能なのでしょうか?
>>443
GetAdaptersInfo
>>440
そうではなくて・・・
VBで開発するときに使う、プロパティ設定が出来るコントロールを作りたいのです。
>>445
だから自分でちまちま既存のコントロール組み合わせて作れっていわれてんだろ。
WC_LISTVIEWを指定しろ
てかここのアマグラマは使えないな
>>445
COM ATL ActiveX

あたりでググってみな。
多分途中でやる気が萎えると思うが。
>>447
> WC_LISTVIEWを指定しろ
それはCreateWindow()を使えってことだろうが
CreateWindowじゃぐぐれもしないだろ
質問に対する解決になってないな
>>450
なに言ってんのあんた?
あんた445?
CreateWindowでググれなんて誰も言ってないぞ。
キーワードは COM ATL ActiveX だ。
とってもややこしい話だからここでかいつまんで説明するって訳にはいかないんだよ。
だからググれといってるの。
上のキーワードの意味が理解できなてなきゃVBのコントロールは作れない。
CreateWindow以前の問題なんだよ。
エディタ作るのにそんなのいらねーだろw
453413:04/04/29 13:12
>>442
それが解からないんですよね。
自分のPCにWin98用のriched32.dllが無くても、
行間が詰まって表示されているソフトがあったので疑問に思っていました。
そういうのはどうなんでしょうね?組み込みなのか、独自にラップしたものか...

ググってみて、OSによってdllが異なる動作をするのは解かりました。
(当方Win2000)
454デフォルトの名無しさん:04/04/29 13:28
>>444
それって、取得だけじゃなくて設定もできるんですか?
455デフォルトの名無しさん:04/04/29 13:55
画面は16bit〜32bitの環境でパレットアニメーションは出来ません。
なので8bit以下のオフスクリーンビットマップを使って、
パレットアニメーションをしようと思うんですが、やり方がまずいのか
失敗してしまいます。

いろんなサイト見て回ったんですが、
画面のシステムパレットをアニメートする方法しか、
見つけられませんでした。

オフスクリーンのビットマップのパレットを使って
GDI関数だけでパレットアニメーションさせる事は、
そもそも可能なのでしょうか? 漏れ、不可能な事やってます?
>>455
可能です。
>>456
って事は漏れのやり方が悪いんですね。
いろいろ試してみます。
どうもありがとう。
458455:04/04/29 16:29
CreateDIBSection で返る HBITMAP を
SelectObject した HDC では
SetPaletteEntries&RealizePaletteを使った
パレットの変更は出来ないみたいなんですが、
他のやり方など、有りますか?
手でやったほうが早い/速い気がせんでもない
ウィンドウを複数作りたいのですが、どうもうまくいきません。
ボタンが押されたら、新しいウィンドウを表示させたいのですが、
どのようにしたらよいのでしょう。
>>458

8ビットDIB/DIBSectionならカラーテーブルを書き換えるだけ。
システムのパレットは関係ないよw
>>460
WM_KEYDOWNとかWM_LBUTTONDOWNとかでCreateWindow
463460:04/04/29 18:18
>>462
WNDCLASSを作るときで引っかかっています
インスタンスとかはどんなやってつくればいいのでしょうか?
DIBSECTION 構造体に BITMAPINFOHEADER がメンバーとして入ってますが、
このメンバーが BITMAPV4HEADER や BITMAPV5HEADER になることはある
んでしょうか。

BITMAPV[45]HEADER を渡して CreateDIBSection() しても、できあがった
DIBSECTION 内では BITMAPINFOHEADER ?
>>463
>作るときで
>どんなやってつくれば
日本語を勉強しましょう。
>>463
WNDCLASS作んなくていいから、
とりあえず、"EDIT"とかで作ってみろ。

それで出来たら、今度はクリックとか考えずに
オリジナルのWNDCLASSを持つウインドウを作ってみる。

今度はそれの応用だ、簡単だろ?
467460:04/04/29 18:39
>>466
コントロールを作るのではなく、ウィンドウを作ろうと思っています。

ウィンドウごとに別のプロシージャを使いたいので、
WNDCLASSを新しく作るしかないと思ったんですが、ほかに方法があったりするのでしょうか?
>>467
知ってるよ。
コントロールを作るのは練習だ、練習。
エディットコントロールは、EDITという名で
WNDCLASSが登録されてるの。
469460:04/04/29 19:22
サブクラス化しようとしたができませんでしたが、
なんとなくで新しく作るWNDCLASSのhInstanceに
メインのウィンドウのインスタンスと同じものをいれたら普通に通りました
ご迷惑をおかけしてすみませんでした^^
こういうやつっていったい何を資料にしてるんだろw
471404:04/04/29 20:17
結局、WS_CHILDで子ウィンドウ作る事にしました。
とっても簡単・確実。
472デフォルトの名無しさん:04/04/29 20:29
Windowsタスクマネージャーのアプリケーションのところに
作ったアプリケーションを表示させないようにするにはどのWSを
消せばいいの?
WS_EX_TOOLWINDOWだっけな。
物凄い黄金アマグラマ群が湧いてるようだな
475デフォルトの名無しさん:04/04/29 21:12
まだ表示されるんですけど
476デフォルトの名無しさん:04/04/29 23:22
>>475 ウィンドウスタイルに「追加」
>>474
春だからね。
>>477
GWだからだと思う。
>>472はタスクマネージャから消したいんだろ?少なくとも俺はどうすればいいか分からない。
サービスにしてsvchostあたりから動かせば可能かもしれないが方法によってはそれでも見れる。
>>479
「アプリケーション」タブに非表示 == タスクバーに非表示
「プロセス」タブじゃない。
そもそも、見えないようにする意図がいまいちピンと来ないんだが。
>>481 愚か者
今までプログラムしたことない新人さんも大量に発生しているからな。
俺も、初GWはプログラミングの勉強に費やした。
485デフォルトの名無しさん:04/04/30 10:17
大量の学生をウォッチ出来るスレはここですか?
>>481
典型的にはタスクトレイ常駐型アプリだろ。
ついでに非表示ウィンドウを親にするという手もある。
なんか、ぐだぐだだな。
タスクマネージャとタスクバーの区別がつかない奴がいるスレはここですか?
bigenPaintでヘアカラーする奴がいるスレはここですか?
もともとそんなにレベルが高いスレじゃなかっただろ
それとも叩いてるほうも学生なのか?
>>488
それはお前だけ
>>489
いやそれはここじゃないって
部屋カラー?
ちがう
タスクトレイ常駐型でもタスクマネージャのアプリケーションタブのとこに
出る奴と出ない奴があるけど、あれは何が違うん?
497496:04/04/30 23:22
あ、今自分でわかったからいいや。今のなし
>>497
そういう情報は横展開しましょう。
499デフォルトの名無しさん:04/04/30 23:44
DIB をクリップボードにコピーしようとしています。
下のようなコードを書いたのですが、クリップボードにコピーされた画像がズレてしまい、
しかもコピーした後でアプリが終了させられてしまいます。

修正方法を教えてください。

hMem = GlobalAlloc(GHND, sizeof(BITMAPINFO) + Bi.biSizeImage);
hGlobal = (LPBYTE)GlobalLock(hMem);

lpBitmapInfo = (LPBITMAPINFO) hGlobal;
lpBitmapInfo ->bmiHeader = Bi;
lpBitmapInfo ->bmiColors->rgbBlue= 0;
lpBitmapInfo ->bmiColors->rgbGreen= 0;
lpBitmapInfo ->bmiColors->rgbRed= 0;
lpBitmapInfo ->bmiColors->rgbReserved= 0;

memcpy(lpBitmapInfo + sizeof(BITMAPINFO), image, Bi.biSizeImage);
GlobalUnlock(hMem);
OpenClipboard(hWnd);
EmptyClipboard();
SetClipboardData(CF_DIB, hMem);
CloseClipboard();
lpBitmapInfo + sizeof(BITMAPINFO)

lpBitmapInfo + 1 もしくは hGlobal + sizeof(BITMAPINFO)
501499:04/05/01 00:35
>>500
ありがとうございました。そんなところだったとは。
で、今度は色がおかしくなったんですが、
lpBitmapInfo ->bmiColors->rgbBlue= 0;
lpBitmapInfo ->bmiColors->rgbGreen= 0;
lpBitmapInfo ->bmiColors->rgbRed= 0;
lpBitmapInfo ->bmiColors->rgbReserved= 0;
は、あってますか?
>>501
パレットを使わないのなら、BITMAPINFOじゃなくてBITMAPINFOHEADERを使え。
>>498
俺も知りたい。教えてください>>496
504499:04/05/01 02:11
>>502
BITMAPINFOHEADER でうまくいきました。
ありがとうございます。

ところで、msdn には、
クリップボードの中身として、 CF_DIB を指定するときは
BITMAPINFO + ビットマップを中身にしろと書いてありますが、
いいんでしょうか?
BITMAPINFO⊃BITMAPINFOHEADER

本来はBITMAPINFOのbmiColorsは[0]なんだけど、
C89の仕様によってサイズ0の配列が作れないから[1]となってるだけ。
パレットを使う場合は、必要に応じて動的確保でサイズを拡張するの。
ものすごい問題外な質問かもしれませんが
関数名で検索して出てくるページにあるやつを
コピペするだけでその関数使えますか?
いまいち。何とかの値とか言われてもどうやって入れたり。。その関数呼び出したりするかわからない・・・
>>506
一つ言っておくことがある。

分らない物を使うな
ここまでくると逆におもしろい。
ウチの新入社員だったら笑えないけど。
509野次馬:04/05/01 09:15
>>507-508
分からずに使って、バグが出たらどうするんでしょ。
楽しみ。ホント。
511デフォルトの名無しさん:04/05/01 10:55
GetSaveFileName()
で、保存するファイル名を取得して、
CopyFile()
で一時ファイルを保存したいのですが、

GetSaveFileName()
でディレクトリを移動させると、ファイルが保存されなくなります。
なぜでしょう。
はらたいらに3千点
>>511
何故って言われても普通はありえないので、動作しないコードをあげるべし。
514511:04/05/01 12:27
よろしくお願いします。
memset(&ofn,0,sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hWnd;
ofn.lpstrFilter = TEXT("Jpeg image [*.JPG, *.JPEG]\0*.jpg;*.jpeg\0\0");
ofn.nFilterIndex = 1;
ofn.lpstrFile = fn;
ofn.nMaxFile = MAX_PATH;
ofn.Flags = OFN_HIDEREADONLY;
if(GetSaveFileName(&ofn)) {
id = CopyFile("tmp.jpg", fn, TRUE);
}
>>514
CopyFileの"tmp.jpg"という指定がカレントディレクトリのファイルを指すからだ。
516511:04/05/01 12:54
コピー元、コピー先の両方が相対パス ---- ○
コピー元、コピー先の両方が絶対パス ---- ○
コピー元は絶対パス、コピー先は相対パス ---- ×
コピー元は相対パス、コピー先は絶対パス ---- ×

ということですか?
違う。カレントディレクトリ(フォルダ)とパスの関係について考えてみると分かるが、
仮に、C:\TESTがカレントディレクトリだとして、"tmp.jpg"と書けば、
C:\TEST\tmp\jpgを指すが、GetSaveFileNameによってカレントディレクトリが
変更され、C:\DOCとなった場合、"tmp.jpg"と書くと
C:\DOC\tmp.jpgを指すからだ。

最も簡単で確実な解決法は、すべて絶対パスで表すことだけどな。
狙ったようなtypoだな
C:\TEST\tmp.jpg
519511:04/05/01 15:27
GetSaveFileName がカレントディレクトリを変えるとは思ってもみませんでした。

「カレントディレクトリ」ではなく、プログラムファイルが置いてあるディレクトリ
を取得する方法はありますか?
>>519
argv[0]
APIスレ的には
GetModuleFileName(NULL, &lpString, MAX_PATH);
argv[0]ってパス入ってないOSが無かったっけ。
CreateProcessのやりかたによっては入ってなかったりするな
>>521
少なくともUnixは起動したとおりに入っている。
パスはないかもしれないし、そもそも実行モジュール名と違う別名(alias)かもしれん。
スレ違いだが

> 少なくともUnixは起動したとおりに入っている。

ダウト。
要はカレントディレクトリなんか当てにするなってことですよ
絶対パス指定でDLLを読み込むにはどうすればいいんですか?
LoadLibraryに絶対パスを渡すだけだろ?
>>527
それでも同名のDLLを同ディレクトリに置いておくとDLLオーバーライドによって勝手にそっちが読まれませんか?
529528:04/05/01 18:20
In Win2K and higher, if there is a file called 'app.exe.local' in the same
directory as app.exe, then all dll's will be loaded from the app's load
directory -- even if its delay loaded with an absolute path that points
elsewhere. the .local. may also override the 'current directory' part of the
search order listed above, but I'm not sure.

というやつです。
それならはじめからそう書いてくれよ

localファイルをユーザーに消させればいいだろ
絶対パスでって指定は無視かいw
役に立たない質問箱だな
532528:04/05/01 18:49
>>531
いえ、確かにlocalファイルが無くなれば絶対指定が効くようになるので解決策になっていると思います・・・
わざわざ逃げ道を作るためにローカルがあれば読む仕様にしたんなら、
別にそれに逆らう必要も無かろう。
ユーザーがローカルに同名のDLLを置いたんなら
それなりの理由があるんだろうさ。
534デフォルトの名無しさん:04/05/01 19:24
こんばんわ

Excelのような多機能List操作APIって無いですかね?
ListControlでは貧弱すぎて、使い物になりません。
535530:04/05/01 19:35
>>532
どーしてもいやならlocalがあるときは起動できないようにすれば?
localを消して新しく起動するっていうのも状況によっては可能なんじゃない


typedef int (WINAPI *GET)();
int main() {
char buf[1000];
::WIN32_FIND_DATA fd;

HANDLE h = ::FindFirstFile("load.exe.local", &fd);
if ( h != INVALID_HANDLE_VALUE) {
::CloseHandle(h);
::BOOL r = ::DeleteFile(".\\load.exe.local");
if (r) {
::MessageBox(0, "deleted exe.local", "", 0);
::ShellExecute(0, "", "./load.exe", "", "", SW_SHOW);
} else {
::MessageBox(0, "could not delete exe.local", "", 0);
}
} else {
HMODULE h = ::LoadLibrary("C:\\absolute\\dll.dll");
GET get = ::GetProcAddress(h, "get");
sprintf(buf, "%d\n", get ? get() : -1);
::MessageBox(0, buf, "", 0);
}
return 0;
}
>>531
自分でファイルを読んでメモリ上に展開すれば良い
ハンドルの扱いなどの都合で関連APIをフックする必要があるかもしれない
絶対パス指定してもlocalがあればローカルを読みます。
MapAndLoad使え
539デフォルトの名無しさん:04/05/01 22:45
質問いいですか?

メモリDCに赤色でFillしたんですが、
その後、ウィンドウDCにBitBltで描画したんですが、
ウィンドウDCになぜか描画されません。
何かしらの間違いをしているはずですが、わかりますかね?


hdc = BeginPaint(hWnd, &ps);

RECT r;
HDC hmdc;

GetClientRect(hWnd,&r);

hmdc = CreateCompatibleDC(hdc);
FillRect(hmdc , &r , CreateSolidBrush(RGB(0xFF , 0 , 0)));
BitBlt(hdc, 0, 0, 300, 300, hmdc, 0, 0, SRCCOPY);

EndPaint(hWnd, &ps);//描画の終了
ビットマップがない
>>539
DCはただの製図道具。紙を用意しなきゃ何も描けん。
メモリDCの場合はビッマップをセットしてやれ。
542539:04/05/01 23:17
>>540-541
失礼しました。

ただ、ウィンドウのコンテキストに直接描画すると、再描画のたびにフリッカーが発生するので、
オフスクリーンを用意して、初めにそちらに描画し終えてから、BitBltでウィンドウコンテキストに描画したいのです。
そのオフスクリーンがメモリDCだと思ってました。

オフスクリーンを使った描画方法って無いのですか?
>>542
だからコンパチなビットマップを作れって。
544539:04/05/01 23:30
表示されました。
Win32はこれまた回りくどいやり方ですね。

どうもでした。
545デフォルトの名無しさん:04/05/02 00:36
ダイアログとフォームの違いはなんですか?
フォームとは?
GDI+ならスッキリするよ
すいません、ダイアログとフォームではなくて、
ダイアログとウインドウでした。

ウインドウ上に、コントロールはおけるの?
全てはウィンドウであり、ウィンドウを適当にまとめあげて都合のいい形にでっちあげたのがダイアログ
>>544 回りくどい

どういう仕様なら満足なんだろう。
551デフォルトの名無しさん:04/05/02 01:58
>>548
ウインドウの上にでも、CreateWindowでコントロールを置けます。
ダイアログは、(たいていの場合)コントロールも含めてあらかじめ
リソースとして作成しておいたウインドウです。
コントロールをたくさん持つウインドウなら、あらかじめ
リソースとして(ダイアログとして)持っておいたほうが便利。
msdn に、CreateToolBarEx は obsolete なので、
代わりに CreateWindow を使えって書いてあったけど、
信じるべき?

MSDNを信じないで何を信じるんだ
KB
CPU使用率を取得する関数はWinAPIにありますか?
リソースエディタで作ったコントロールの集まりを
親ウインドウの上に乗せる方法を教えてください。
557デフォルトの名無しさん:04/05/02 06:12
>>555
RegQueryValueEx
>>556
CreateDialog
>>539
ps.rcPaintとrc={0,0,300,300}をIntersectRectしてFillRectしたら駄目?
>>539
それよかCreateSolidBrush(RGB(0xFF , 0 , 0)はどこでDeleteObjectしてるんだ?
CreateSolidBrush(RGB(0xFF , 0 , 0)

CreateSolidBrush(RGB(0xFF , 0 , 0))

OTZ
どーでもいいが、矩形塗りつぶしならExtTextOutのほうが楽だぞ、と。
563デフォルトの名無しさん:04/05/02 14:03
CreateWindow( "BUTTON", "hogehoge",
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
20, 20, 100, 30, hWnd, (HMENU)ID_MI, hInst ,NULL);
で、ボタンがウインドウ上に追加されるのと同じようなやり方で、
リソースファイル中のダイアログをウインドウ上に追加できますか?
>>563
そのリソースが子ウィンドウならおK。
mciSendCommandを使ってドライブのトレイを開閉させるとき、web上にある
ほとんどの例がMCI_WAITを指定して完了するまで制御を戻さないように
しています。

この場合にMCI_WAITを抜くのはあまりよろしくないのですか?
566デフォルトの名無しさん:04/05/02 14:46
>>564
リソースID が IDD_DIALOG だった場合、実際のコードはどうなりますか?
>>566
リソースデータをハンドリングして
一つ一つCreateWindow
>>565
MCI_WAITをはずした場合、処理が終了しなくてもmciSendCommandが返ってしてしまうので、
MCI_NOTIFYを使って処理終了を待ってから次のコマンドを送信するようにせなあかんくなる。

なので、再生時はともかく初期化処理しているときはいちいちNOTIFYを待つのはめんどいので、
WAITで呼び出したりする。
続き。
トレイ開閉は、たとえば開いている最中に閉めるコマンドを送信した場合、
どういう状況になるか分からないから、安全策としてWAITしてるんじゃないかね。
>>568 >>569
ご意見ありがとうございます。

それが目的であると思われそうですね。CDを入れた状態でトレイを閉めると
しばらく反応なしになるので何となくすっきりしませんでした。ほとんど自分用に
作っているので、SetTimerで開閉直後はしばらく受け付けないようにしようかと
思います。
どうもありがとうございました。
571デフォルトの名無しさん:04/05/02 16:10
スクロールバーを動かすと数字が増えていくサンプルを作りたいのですが、
矢印ボタンを押している間に数字がかわりません。
(離すと一気に数字が変わってしまう)
押しっぱなしにしてる間、絶えず数字が変化するようにするにはどうしたら良いでしょうか?
教えてください。

↓は上手くいかないソースコードです
case WM_HSCROLL:
switch(LOWORD(wp)) {
case SB_LINERIGHT:
if (scr.nPos < scr.nMax) {
scr.nPos++;
SetScrollInfo(hwnd , SB_HORZ , &scr , TRUE);
wsprintf(ch, "%d", scr.nPos);
TextOut(Back_DC, 300, 300, ch, strlen(ch));
}
break;
}
>>566
CreateDialog で出来るって書いたじゃん。

IDD_DIALOG をリソースエディタ上で作るときに
ダイアログプロパティのスタイルタブで
スタイル:「チャイルド」
境界線:「しない」
にしとけば、

hChildDlg = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG), hWndParent, (DLGPROC)DlgProc);

BOOL CALLBACK DlgProc(HWN hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
return FALSE;
}

で hWndParent の上に貼り付く。
IDD_DIALOG 上のコントロールからのメッセージは全て DlgProc に行くから
後はそこで処理するなり、親ウィンドウに送りなおすなり好きにしな。
GDI+でテキストのバウンディングボックスのサイズを正確に取得する方法
を教えてください。
ドキュメント上は
Gdiplus::Graphics::MeasureString()
で取れる仕様になってるんですが、実際に取得すると幅が若干広いので、
この情報を信用して描画すると、テキストの間が空きすぎてしまうのです。
試したところ、半角スペース一文字の幅を↑で取得して返ってきた
値を引いてやると、大体ちょうどいい感じになるようですが、こんなやり方で
いいのかという疑問があります。
Fontの色や属性を一部変えつつ描画するといった場合には必須だと
思われるのですが……
MCIでmciSendString()を使ってゴリゴリやっているんですが、

↓自作クラス
C_MCI::open
C_MCI::saisei

っていうのが同じものを操作するとしても、
WNDCLASSAでオープンしてWNDCLASSBから再生すると、
オープンされていません
っていうエラーがでました
同じエイリアス名でも、WNDCLASSが違うと呼び出せない気がする・・・

なにか方法はありませんでしょうか?
>>573
終端文字のサイズも計算してないか?
>>575
終端文字とは?
仕様上、trailing spaceの幅はデフォでは計算しないようですが
一文字ずつ食わせると、はっきり「幅が広すぎる」ことが分かります。
なんだ、フォントがプロポーショナルというオチか。
>>577
は?
プロポーショナルフォントだからこそ、メトリックスをシステムに
図らせたいんですが?
Aという文字に続いてBという文字をレンダしたいときに、
Aの幅情報が必要でしょう。
別にカーニングやリガチャのような複雑な処理を求めている訳ではありませんよ。
見た目の印象から言うと、Gdiplus::Graphics::DrawText()はどうも
左右に半角スペースの1/2程度の幅のマージンを入れたがるようなのですね。
で、Gdiplus::Graphics::MeasureString()はそのマージン含みの
バウンディングボックスを返してくる、という印象です。

GDIならば::GetTextExtentPoint32()を使うところでしょうが、
Gdiplusではどうやるのが正しいの?というのが質問内容です。
C#ではくくりつけのGraphics2DエンジンがGDI+ですから
同じ問題に遭遇するでしょうしね。
×DrawText()
○DrawString()
ですた。
581デフォルトの名無しさん:04/05/02 19:11
ボタンの上にアイコンを描きたいのですが、どうしたらできるんでしょうか。
おーなーどろー
>>574
WNCLASSが違うとって、何を言ってるのか分からんのですが、
別スレッド同士だとエイリアス名共有できないというのは体験したことある。
そのときは、Aスレッドでオープンした曲をBスレッドで操作したかったのですが、
結局Aスレッドのウィンドウにメッセージ送って制御させました。

あまり参考にならないかな。。。
>>574
オープンしたデバイスを共有したいってこと?
mciSendCommandでMCI_OPENして、取得したデバイスIDをstatic宣言した領域に格納するとか。
>579
http://www.codeproject.com/cs/media/measurestring.asp
> I found this technique through a GDI+ KB article (Q307208) at http://support.microsoft.com/default.aspx?scid=kb;EN-US;q307208
> Summary: to measure a string without resolution dependent effects and 1/6 em gaps you must use a GenericTypographic StringFormat.
> Something like:
> sfmt = StringFormat.GenericTypographic;
> size = graphics.MeasureString( m_Text, m_ActiveFont, 1000, sfmt );
> Although the article doesn't say it, I believe the GenericTypographic StringFormat sets some internal bits that are not available through the API any other way, at least I haven't found them (and I've been trying).
>>583
>>586
Thx.
MeasureCharacterRange()を使え、ということですね。
ありがとうございました。
588デフォルトの名無しさん:04/05/02 20:12
MessageBox関数の戻り値は、いつの間にINT_PTRに変わったの?
変わってないだろ
590588:04/05/02 20:18
typedef _W64 int INT_PTR, *PINT_PTR;
591588:04/05/02 20:21
INT_PTR DialogBox(HINSTANCE hInstance,
    LPCTSTR lpTemplate,
    HWND hWndParent,
    DLGPROC lpDialogFunc
);
だってさ。

VisualStudio.net 2003 Pro に付属のMSDNより。
MessageBox関数とDialogBox関数は全く別のものですが。
593588:04/05/02 20:29
ごめん、588が間違いだった。
正解は、
DialogBox関数の戻り値は、いつの間にINT_PTRに変わったの?
だった。
何でそれが気になるの?
たぶんWINVER==0x0500ぐらいから。
596588:04/05/02 20:47
こないだVS.net買って、うれしくて昔作ったのをビルドしてみたら、
型違い警告が出てちょっといやな感じだから。
まぁ、正直あまり気にしてないけどVisualStudio買った記念カキコ
したかっただけ。
休み厨の中でもGW厨が一番ひどいな
598デフォルトの名無しさん:04/05/03 00:17
telnet:// に割り当てられているアプリケーションのパスとかを
取得するにはどうしたらよいのでしょうか?
HKCRを漁れ
>>596
そんなおまいは、とりあえず警告レベルをあげろ

hMemDC = CreateCompatibleDC(hDC);

で、画面を作成して、

WM_PAINT:

FillRect(hMemDC, &rect, CreateSolidBrush(RGB(100, 100, 128)));
〜中略〜
BitBlt(hDC, 0, 0, MEM_SX, MEM_SY, hMemDC, 0, 0, SRCCOPY);

で画面を塗りつぶしているんですが、
何秒か経過したところでFillRectが実行されなくなってしまいます。
(背景色が表示される)

安定して画面を塗りつぶすのにはどうしたらよいのでしょうか?
どなたかご教授お願いします。
>>601
100,100,128のブラシDeleteObjectしてんのか?
>>601
559あたりから読み直してください
>>601
GDI Object大量生成(w
>>602 >>603 >>604
ブラシ削除するの忘れてました。吊ってきます∧‖∧
ありがとうございました。
606601:04/05/03 10:42
↑名前入れ忘れました、601です。
607
608デフォルトの名無しさん:04/05/03 17:43
CreateWindowEx でツールバーを作っているのですが、アイコン描画されません。
なにが悪いんですか?

case WM_CREATE:
InitCommonControls();
hToolBar = CreateWindowEx(
0, TOOLBARCLASSNAME, (LPSTR) NULL,
WS_CHILD | CCS_TOP,
0, 0, 0, 0, hWnd, (HMENU) NULL, hInst, NULL);
SendMessage(hToolBar, TB_BUTTONSTRUCTSIZE,
(WPARAM)sizeof(TBBUTTON), 0);
tbarddbitmap.hInst = NULL;
tbarddbitmap.nID = (int) LoadBitmap(hInst, "IDB_BITMAP1");
SendMessage(hToolBar, TB_SETBITMAPSIZE,
0, (LPARAM)MAKELONG(32, 32));
SendMessage(hToolBar, TB_SETBUTTONSIZE,
0, (LPARAM)MAKELONG(32, 32));
SendMessage(hToolBar, TB_ADDBITMAP, 3, (LPARAM)&tbarddbitmap);
SendMessage(hToolBar,
TB_ADDBUTTONS, (WPARAM)3, (LPARAM)&tbb);
SendMessage(hToolBar, TB_AUTOSIZE, 0, 0);
ShowWindow(hToolBar, SW_SHOW);
609デフォルトの名無しさん:04/05/03 17:44
ダイアログ作ってGetDlgItemTextした文字を普通にウインドウに表示したいんですけど
GetDlgItemTextで得た文字をどうやってメインで使ったらよいのかわかりませぬ
TextOutとか。
メッセージループ関係の質問です。

PeekMessageの第四引数にPM_REMOVEを指定するのと、

PeekMessageの第四引数にPM_NOREMOVEを指定して次に
GetMessageを使用するのとでは何か違いがあるでしょうか?

例えば

if (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)){
  if(!GetMessage(&msg, NULL, 0, 0)) return msg.message;
  TranslateMessage(&msg);
  DispatchMessage(&msg);
}

と、

if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
  if(msg.message == WM_QUIT) return msg.message;
  TranslateMessage(&msg);
  DispatchMessage(&msg);
}

です。
メッセージがないときにブロックするかどうか。
613デフォルトの名無しさん:04/05/03 21:22
LoadBitmap(hInst, "IDB_BITMAP1");
が、NULL を返します。どのような原因が考えられるでしょうか?
IDB_BITMAP1 は確かに存在します。

開発環境がWin98なため、GetLastErrorは使えません。
GetLastError

対応情報
Windows NT: バージョン 3.1 以降
Windows: Windows 95 以降
Windows CE: バージョン 1.0 以降

まぁあとは
"IDB_BITMAP1" なんてのは無いんだろうなぁ。

とりあえず、MSDNライブラリをよく見るべし。
615デフォルトの名無しさん:04/05/03 21:41
リソースファイルは
IDB_BITMAP1 BITMAP DISCARDABLE "bitmap1.bmp"
となっています。もちろん、bitmap1.bmp もあります。

あと、MSDN には、
LoadBitmap
Windows NT/2000/XP: To get extended error information, call GetLastError.
と書いてありました。
リソースをリンクしてないとか
>Windows NT/2000/XP: To get extended error information, call GetLastError.
Win98じゃ使えないとは書いてないね
>>615
resource.hとかに
#define IDB_BITMAP1 xxxx
みたいに定義されてないか?
それならMAKEINTRESOURCE(IDB_BITMAP1)を使え
そりゃそうだけど、普通に考えて対応してないだろ。
昔、resource.hから #define IDB_BITMAP1 を削除して解決した猛者を見たことがあるが
普通はMAKEINTRya
Win32APIよりもCに近い話なのかもしれませんが、質問させてください。
返り値無し(void)のAPIが色々ありますよね。これをGetProcAddress/LoadLibraryして呼び出し、
返り値をintに格納させると一定の値を返す事があるのですが、どのように実装されているのでしょうか?
関数からreturnで値を返していることはないと思うんですが、、、
>関数からreturnで値を返していることはないと思うんですが、、、

たまたま EAXレジスタの値がそうだっただけではないかな?
622デフォルトの名無しさん:04/05/03 21:58
リソースは普通に作った場合自動的にリンクされますよね?
同じリソースファイル中のアイコンは読み出せます。

GetLastError は 87 (ERROR_INVALID_PARAMETER)が入ってました。
623デフォルトの名無しさん:04/05/03 22:02
MAKEINTRESOURCE で解決しました。こんなことに数時間もかけてしまうなんて……
ありがとうございました。

このマクロはいつごろ追加されたんですか?
少なくともWindows95のときにはあった。
See Also
Bitmaps Overview, Bitmap Functions, CreateBitmap, DeleteObject, LoadCursor, LoadIcon, LoadImage, MAKEINTRESOURCE

くらいみろよ。
626620:04/05/03 22:16
>>621
そうですね、、一応不定の値ではなく一定値が返ってはくるようなんですが、同じ演算をした結果が返るわけですから
当然なのかもしれません。ありがとうございました。
627デフォルトの名無しさん:04/05/03 22:33
640x480ピクセルのビットマップを表示したいのですが、
どうしたらウインドウの大きさを調節できますか。
>>623
私が3.1でプログラミングを始めた時にはすでにありました。

長老と呼ばせてください
>>627
SetWindowPos
>>627
AdjustWindowRect
631デフォルトの名無しさん:04/05/04 00:58
rect.top = 0; rect.left = 0;
rect.right = 640; rect.bottom = 480;
AdjustWindowRect(&rect, 0, TRUE);
SetWindowPos(hWnd, HWND_TOPMOST, 0, 0,
rect.right - rect.left, rect.bottom - rect.top, SWP_NOMOVE);

とすると、ウインドウの外枠を含めて 640x480 になってしまいます。
クライアント領域だけで640x480にしたいのですが、方法はありますか?
>>631
ウインドウサイズとクライアントサイズの差分だけ広げろ
AdjustWindowRectはメニューの折り返しを自動で考慮してくれないし、
折り返し状況を取得する方法がないからだめ。
#include <stdio.h>

int main(){
MessageBox(NULL, "Hello World!", "Caption", MB_OK);
return 0;
}

これがコンパイルできません。何故ですか?
#include <windows.h>
タワラ

-#include <stdio.h>
+#include <windows.h>
636デフォルトの名無しさん:04/05/04 02:01
-int main(){
+int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ){
>>636
それはもんだいではない
(ノ∀`)アチャー
最近PCはじめたやつは>>633のような発想を平気でする。
もうPCにはウインドウしかなくコンソールやDOSなどというものは考えもしないのだろう。
だから>>633のようなコードを書いておいて平気で
「コンパイルできません」
のような発言をする。
たのむからLSI-C86の試食版あたりからプログラムの勉強をしてくれ。
640633:04/05/04 02:24
ありがとうございました。
>>639もコミュニケーションの勉強をした方がいいな
釣れたw
643デフォルトの名無しさん:04/05/04 12:22
リソースファイルに項目を追加したときに、
自動的に resouse.h が書かれるようにするにはどうしたらいいですか。
支援のあるIDE使ってるなら自動でやってくれるだろ
テキストエディタで弄ったら自動でってのなら、そんなキモイことして欲しくない。
>>643
IDEかなんかの話か?
もちっと状況を説明しないとたたかれて終わるだけだぞ。
>>643
禿しくスレ違い。



それに "resource.h" の間違いにちまいまい。
いやもしかしてIDEを作ろうとしているのかもしれない
しかしAPIってかofstreamだな
それはAPIと呼ぶのか
ha?
hi ?
hu?
中身はAPIだがAPIの話題ではないな
レジストリや.iniならセーフってことか
654デフォルトの名無しさん:04/05/04 17:05
次のコードについて質問です。
hFile = CreateFile(TEXT("file.txt"),
strFile = (LPSTR)malloc(GetFileSize(hFile, NULL));
ReadFile(fh, strFile, GetFileSize(hFile, NULL), &wReadSize, NULL);
CloseHandle(fh);
filelist[wReadSize] = '\0';

1.このコードは安全(確保されたメモリ以外の場所に書き込みを行わない)ですか?
2.filelist[wReadSize] = '\0' が必要なのはなぜですか?
655デフォルトの名無しさん:04/05/04 17:07
filelist でなくて strFile でした。
>>654
いいえ。
>>654
1.
最後の行でぶち壊している。

2.
必要ではない。
1.いいえ。
 理由1:最後に埋める\0分のサイズが足りない
 理由2:該当ファイルが3.5GBとかあったらどうするのか。
660デフォルトの名無しさん:04/05/04 17:40
>>654
Cなの?C++ならmallocはやめてnewを使おうよ
1.1バイトリークしてる
2.strFile[wReadSize-1] = '\0';
とすべきでしょう。必要なのはprintf(strFile);とするときに文字列終端
であるNULLが無いと困るから
>strFile[wReadSize-1] = '\0';
>とすべきでしょう。
正気か
>>654
1. いいえ。2回目のGetFileSize()の戻り値が、最初のGetFileSize()の
戻り値より大きい可能性がある。
663660:04/05/04 17:47
>>661 スマソ、ループさせてるのかとおもったヨ
CloseHandle()してるな。
リークしないけど1バイト壊すとこだった(w
664660:04/05/04 17:50
hFile = CreateFile(TEXT("file.txt"));
strFile = (LPSTR)malloc(GetFileSize(hFile, NULL)+1);
ReadFile(fh, strFile, GetFileSize(hFile, NULL), &wReadSize, NULL);
CloseHandle(fh);
strFile[wReadSize] = '\0';
...
free(strFile);
>>660
喩えファイルが短く、直接printf()したい場合であったとしても、
終端のナルキャラは必要ではない。
つーか、ちっとも困らない。
666デフォルトの名無しさん:04/05/04 17:57
というか、
FILE* fp = _tfopen(TEXT("file.txt"),TEXT("rb"));
char* pBuf = new char[nFSize+1];
memset(pBuf,0,nFSize+1);
fread(pBuf,1,nFSize);
pBuf[nFSize] = '\0';
fclose(fp);
...
delete [] pBuf;

のほうがいいな、俺は
667666:04/05/04 17:58
> pBuf[nFSize] = '\0';
これ要らなかった(w
668デフォルトの名無しさん:04/05/04 17:59
>>666
freadの引数が足りない
C++ならSTLコンテナなりスマートポインタ使おうや。
670デフォルトの名無しさん:04/05/04 18:22
>>668 あ、ほんまや(w
ファイルポインタはどこ逝った。
>665
nande?
>>666
中途半端にC++使うのは好きじゃないなあ。
>>672
printf("%.*s", nFSize, pBuf);
ってことでしょ。
すいませんVC++6.0 でMFCを使用しないで開発を行ってるんですが
「PrintScreen」キーが押された際に送られてくるメッセージが判らないのです。

WM_KEYDOWN 時に VK_SNAPSHOT,VK_PRINTSCREEN 等調べてみてそれっぽいことをしても
巧くいきませんでした。
なにか良い方法はないでしょうか?
675ですがすんませんです。
ホットキーというものを使ったところ思った処理ができるようになりました。
お騒がせしてすいませんでした。
>>611-612
PeekMessageってメッセージが無ければ0を返すんだから
どちらもメッセージ無い時は条件入らないんじゃ?
あまり詳しくないんで、違ってたらスマソ。
ACPI温度管理ゾーンをCreateFile()するところまで上手く行ったんだけど、DeviceIOControl()でアクセスエラーが帰ってきて何も取れない....

handle = CreateFile(
detail->DevicePath,
0,
0,
NULL ,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL );

THERMAL_INFORMATION thm;
ret = DeviceIoControl(
handle,
IOCTL_THERMAL_QUERY_INFORMATION,
0,
NULL,
&thm,
sizeof(thm),
&bsize,
NULL );

ひょっとして、根本的に間違ってるのかな?

>>678
というか、CreateFile の第2引数が 0 なんですが。
DeviceIoControl で必要なアクセスタイプを指定する必要があるんじゃない?
DeviceIoControl 使ったこと無いが…
680678:04/05/05 14:04
>>679

0がデバイス問い合わせアクセスとなっていたので0にしていた。
ひとまず、GENERIC_READを指定してみたけどやはり取得できない。。。

ただ、DeviceIoControlのエラーコードが0のときは”アクセスできません”で
GENERIC_READのときは"ファンクションが違います"になるようです。


681taro:04/05/05 14:16
他サイトで回答が得られないっぽいので、マルチポスターをお許しください
m(__)m

定額PHSパケット通信AirH"のVenturi Client(通称:竜巻)という圧縮プロキ
シを使用時に、自作アプリの通信が出来なくて困っています。
ttp://www.ddipocket.co.jp/customer/download/tornado/

SDKでWinSockを直接叩いて、同期ソケットで単純に
WSAStartup()して、gethostbyname()して、getservbyname()して、
socket()して、connect()して、send()して、recv()して
そこら辺の普通のHTTPサーバからHTML文書をダウンロードしているのですが
send()で「GET http://www.odn.ne.jp/index.html」などと送信してから
recv()で受信しようとするとrecv()から処理が戻ってきません。
send()ではちゃんと全バイト数の返り値が返ってくるので、送信は
たぶん出来ていると思うのですが(自信ありません。。)

竜巻を動かしていない時には一応ちゃんとダウンロード出来ているのですが
全くの初心者状態なので、プロキシサーバを間に入れて通信するには
どうしたらいいのかとかもわからないというような状態です。。
どなたかご存知の方がいましたら、アドバイスをお願い致しますm(__)m

申し遅れましたが環境は、Windows2000pro・VC++6.0pro・SDKです。
どうぞ宜しくお願い致します。
Winsockスレで聞けば?
Sendは内部で処理されるため実際に送信されて無くても送信したことになってる。
>>681
何となくだけど、プロキシーに規制がかかってるんじゃないのかな。
GETを飛ばすときにUser-Agentを騙す必要があるとか(w
だいたいそのプロクシの仕様がわからないとどうしようもない。
ローカルで動いてるのか別のとこにあるのかポートはなにかとか。
仕組み読んだけど全然わかんね。
クライアント→圧縮プロクシ→サーバーって事なんだが
クライアントにもローカルプロクシが立つのかがわからない。
687デフォルトの名無しさん:04/05/05 15:27
こんにちは

リージョンをメモリDCに適用することはできないのでしょうか?
どうも、うまく適用されません。

hdc = GetDC(hWnd);
hMemDC = CreateCompatibleDC(hdc);

(略)

SelectClipRgn(hMemDC , hRgn);
688687:04/05/05 15:52
すいません。
メモリDCにクリップリージョンが適用されました。
単純ミスでした。
すいません。
Window内の任意の場所にスクロールバーを配置したいのだが
どのライブラリーを使えばいいのか教えてほしい
690689:04/05/05 18:04
解決しました。
すいません。
GWはもうすぐ終わりだ!みんながんばれ!
692689:04/05/05 19:13
ごめん。
もう一回。
CreateWindowsExで作成したスクロールバー(単独)のものを操作するには
何のAPI使えばいいの?

スクロールバー内の情報をセットしたいのです。
ただ、SetScrollInfo(hwnd , SB_VERT , &scr , TRUE);だと、ウィンドウ内にある両端のスクロールバーを操作するものですよね?
私が作ったスクロールバーは、単独のものです。

         CreateWindowEx(
0L,
"SCROLLBAR",
(LPSTR) NULL,
WS_CHILD | WS_VISIBLE | SBS_VERT,
SetScrollInfoの説明をよく見よう。
SB_HORZとSB_VERT以外に何がある?
694689:04/05/05 19:45
>>693
解決しました。
本当にすいませんでした。
695taro:04/05/05 21:28
すみません、鈴木亜美ちゃんの復活スレ見てたので遅レスすみません。。

POP3通信をしてみたら普通に動いたので、もしやと思い、今までHTTP0.9形式で
リクエストしてたのを、HTTP1.0or1.1風味でやってみたら無事通信できました。
レスくれた方々ありがとうございましたm(__)m
696デフォルトの名無しさん:04/05/06 03:13
Win 2000/XP だけが通知してくるメッセージを処理する
コードを書いた場合、そのプログラムは Win 9x でも
(メッセージ処理用のコードを除いて)動作しますか?

ソフトウェア仕様云々より、むしろ使用しているAPIで決まる。
>>682
Winsockスレってどこにありますか?
教えてください。
後方互換性意識してDLL作るときはDEFファイルで序数指定するもんだって
思ってたし、MSDNにもそんなこと書いてあるんでそうしてたんですが、
それって過ちじゃないかと今日気づきました。

DependencyWalkerで見ると、序数指定つきで作られたインポートライブラリ
からインポートしているプログラムは、当然のように序数でインポート
してるんですね。ところが、__declspec(dllexport)、あるいは
序数指定無しのDEFファイルで指定されたシンボルは、
名前でインポートしてるのが分かる。あくまでやってみて気づいた
経験則であって、どこにもそんなことは書いてないですけどね。
これ、どっちがいいかっつったら勿論後者ですよね。スタブコードが
ちゃんと名前でGetProcAddress()してくれるなら、
バージョンアップの際にいちいち序数管理する必要ないから。

で、面白くなって色々調べてみると、MS謹製のライブラリでも、ものに
よってまちまちなんですよ。kernel32, user32, msvcrtのような奴は
名前エクスポートなんだけど、mfc42, oleaut32, wsock32あたりは
序数エクスポートになってる。
いったん序数エクスポートにしちゃうと、後方互換性のためにはそれを
維持しなきゃいけないからそうなってるのかなあ、とか思ったりしました。

皆さんは、この辺、どうやってますか?
CD-R にデータをベタで書き出したいのですが、特別な API があるのでしょうか。
開こうとしているファイルが他のプログラムによって
開かれている(WriteOpen)ことを検知するAPIはありますか?
>>699
互換性維持っていうほど簡単じゃないと思う
俺はすっかり放棄
>>699

昔は序数リンクしかできなかったんじゃなかったっけ?

序数リンクのほうがリンクがごく僅かに速いだろう、というのはあるけ
ど、互換性目的以外で今の時代にわざわざ序数リンクを使う理由なんて
ない。
OS板のK&Lキチガイさんたちなら僅かなファイルサイズ・メモリ節約のために序数リンクするかもなぁ。
705699:04/05/06 20:17
>>703
その「昔」というのはWin16時代のDLLですか?
kernel32が名前エクスポートになってるということは、Win32は最初からそれを
サポートしていたということになりますね。
ていうかGetProcAddress()が名前でDLLのシンボルをfetchできる
以上、できないはずがないのだけれど。

>>704
ご丁寧にNONAMEまでつけてしまうということですか。Unixでstripをかけるのと同じ
感覚なのだろうか。

序数つきで作成したimport library(NONAME指定無し)にも、ちゃんと名前シンボル
は入ってるんですよ。で、私には序数「無し」で作成したものとの違いがlibファイル
だけでは分からないのですが、MSのリンカは不思議なことにこれを区別する
んですよね。
序数指定無しの場合はlibが勝手に序数を指定するだけだと思ってました。ていうか
ドキュメントにそう書いてあるし。
メッセージループについてなんですが、

時間のかかる処理をしている最中にも、
ウィンドウ操作ができるようにと、
PeekMessageを定期的に呼び出すようにしたのですが、
その時に、メニューとかの操作を行うとその処理が終わるまで、
呼び出し元(=ここでは「時間のかかる処理」)が止まってしまいます。

呼び出し元を止めずに処理することはPeekMessageでは出来ないのでしょうか?
>>706
そこでマルチスレッド。
>>706
処理の流れは常に一元的だ。
>>707
>>708
頑張ってマルチスレッドに取り組んでみます。
レスありがとうございました。
>>709
地獄に片足つっこんだな・・・
きっちりセマフォ仕込めば地獄でもないっしょ。
>>711
片足だから。
でも原因がすぐにわからないバグがあったときなんか
あってるのにものすごいスレッド部に自信がなくなる・・・
UIと処理で2スレッドだけならそれほど複雑ではないけどなあ。
勝負は三スレッド目からと言うじゃないですか
4つめ以降は結構楽かなw
五つめ以降でテンション高くなってきます。
6つを超えると仕様に疑問を抱き始めます。
7つ目に達するともはや思考停止して黙々とコーディングします。
管理スレッドとワーカスレッドなら一時的にどれだけ走ってても気にならんけどな。
3スレッドで大丈夫なら桁が変わっても大丈夫。
…パフォーマンス以外は。
128つも稼動させると、Win9xとともに昇天できます
9xは「リソース不足です」っていうメッセージを表示するために
最後のリソースを使い切ってあぼーんすることが多すぎる。
あるイベントごとにスレッドを起動する処理を書いた。
あるときイベント処理が滞った。
気付いたらスレッドが爆発していた。
#ありがちではある。
単純に並列作業ならかまわないがいろいろ関係してくると複雑になる。
Deadlockとか。
マルチスレッドはデバッグしづらいからなぁ・・・
スレッドがどう動いてるかリアルタイム&レジューム付きでグラヒィカルに
表示してくれるツール無いかなぁ・・・
イベント、クリティカルセクション対応で依存まで表示してくれる。
一言だけ言わせて貰う。

クソスレ立てんな。
盛大な誤爆乙。
>>726
ちょっと寒いが>>725のギャグを理解してやろうな?
ギャグなの?
あー、2chのスレ/スレッドとプロセス/スレッドのスレをかけたのか。


わかるかヴォケ
>>724
インテルがスレッドのデバッグ&プロファイルツール出してるよ。
スレッド数管理スレッドなんてのはあり?
スレッド数管理スレッドってか、GUI回りやイベント処理、スレッド生成なんかは
それ用のスレッドで管理せんとダメだろ。
むやみやたらにスレッドを増やすのはオススメできない。
きちんと管理できるように体系立ててやってるうちはいいけど、特定のパターンで沈黙したら困るからここスレッドね、
ってなことを繰り返してるとVer.2で総つくり直しなんて目にあいかねない。
スレッドは終わらせるときが一番難しい…
穴だらけの終了処理をみると目を覆いたくなる。
ワーカーより先にメインスレッドが終わるケースをまったく考えて無い奴とか。
>>730
リアルタイムじゃない。
あと、スレッド間の依存とかグラヒィック表示も弱いし。
体験版使ったが英語でよくわからない・・・・
まあ、あれ使って一カ所バグ発見できたが。
>>729
あんたの突っ込みで笑えた。
>>736
やっぱり、ツッコミはボケを引き立てるからな。セットでないと。
>スレ/スレッド
って何?
>>738
今いるところ。
>>738
マトリックスしてる状態じゃないかな
スレ・スレッドってPG
742デフォルトの名無しさん:04/05/07 23:48
助言をお願いします。
SetDIBitsToDeviceをつかってPNGファイルを読み込もうとしているのですがうまくいきません。
とりあえず640*480のPNGを読もうとしているのですが、SetDIBitsToDeviceの戻り値が0になって、GetLastErrorが「パラメータがただしくありません」になります。
もう、どこを修正していいのか分かりません。
分かる方、アドバイスお願いします。

//memDC,PngFileSize,pPngFileDataは設定済み。
//OSはMeです
BITMAPINFOHEADER binfo;
binfo.biSize=sizeof(BITMAPINFOHEADER);
binfo.biWidth=640;
binfo.biHeight=480;
binfo.biPlanes=1;
binfo.biBitCount=0;
binfo.biCompression=BI_PNG;
binfo.biSizeImage=PngFileSize;
binfo.biXPelsPerMeter=0;
binfo.biYPelsPerMeter=0;
binfo.biClrUsed=0;
binfo.biClrImportant=0;

SetDIBitsToDevice(memDC,0,0,640,480,0,0,0,480,pPngFileData,(BITMAPINFO*)&binfo,DIB_RGB_COLORS);
BI_PNGは使えないと思っとけ。いじょ。
744742:04/05/08 00:44
PNGは読めないってことでしょうか?
MSDNには98以上で使えると書いてあったので大丈夫と思っていたのですが・・・
無理ならSusieプラグインを使ってみます。
まぁお前らド素人は、libpng拾ってきて、ライブラリでも使ってなさいってこった。
Windows 98/Me, Windows 2000/XP: If the driver cannot support the JPEG or PNG file image
passed to SetDIBitsToDevice, the function will fail and return GDI_ERROR. If failure does
occur, the application must fall back on its own JPEG or PNG support to decompress the
image into a bitmap, and then pass the bitmap to SetDIBitsToDevice.

俺はプロだからGDI+を使う。
WinXPを対象にするなら、そろそろGDI+でもいいかもね。
他OSだと、GDI+のインストールを促さないとあかんので、面倒なことになりそうだけど。
749デフォルトの名無しさん:04/05/08 08:10
ウィンアプリでDefWindowProcはswitchのdefaultの所に書いてありますが、
returnの所に書いても大丈夫なのでしょうか。WM_PAINTなどを実行した後に
DefWindowProcを実行しても大丈夫かという意味です。
あんまりよくない。
751749:04/05/08 10:24
>>750
ありがとうございました。分かりました。
>>748
GDI+のDLLはアプリと共に配布する事が許可されています。
>>752
VBランタイムと同じ(サイズは違うが)で、やっぱトラブルの元だと思うよ
>>753
そのためのside-by-side(ryって
XP以前のOSじゃほとんど使えないか
> XP以前のOSじゃほとんど使えないか
話にならんほど使えんな
エントリー関数名が「main」だとどうなりますか?
深いレベルの話では、別にどうもならない。
一般的な話なら、コンソールアプリケーション。
758デフォルトの名無しさん:04/05/08 16:52
>>753
GDI+のdllはCOMじゃないから、exeの横にgdiplus.dllを置いておくだけで事足りる。
だからトラブルはあまり起こらないと思う。
759デフォルトの名無しさん:04/05/08 17:29
WinMainの第一引数であるHINSTANCEをコールバック関数で得たく、
AfxGetInstanceHandleという関数を見つけました。
これは引数が無いみたいですが、
HWNDを渡さなくても大丈夫なんでしょうか。
また、別の関数で得るのなら、それを教えてください。
>>759
大丈夫です
761デフォルトの名無しさん:04/05/08 17:35
>>759
MFCじゃないのかそれは
自プロセスのHINSTANCEしか返らないからHWND渡さなくても大丈夫
762759:04/05/08 17:36
>>760
TextOutとかGetDCとかほとんど全ての関数の引数にHWNDが必要なのに
なぜこれは大丈夫なのでしょうか(っておかしいですが)。
763759:04/05/08 17:38
>>761
MFCじゃないです。
そのコールバック内から呼び出すから大丈夫という事ですか。
全てのAPIにHWNDが必要だった場合を考えてみよう。
>>762
TextOutを復習しよう
>>763
おぉ、Win32でもほんとにあった、同じ名前なんだな
まぁこれで他プロセスのHINSTANCE取れたらとんでもないことになりそうだと思うが
767759:04/05/08 17:54
すいません。そもそもSDKでは以下のエラーが出て無理なようです。
afx.h(15) : fatal error C1189: #error :
MFC requires C++ compilation (use a .cpp suffix)
グローバル変数か、関数にstaticで保存しとく、とかにします。

>>765
すいません、HDCです。

お答えいただいた方、ありがとうございました。
GetModuleHandle(NULL)でいいじゃん
769759:04/05/08 18:04
インスタンスだけでなく、リソース、アプリケーション名も
同じようなエラーが出ます。

>>766
というと自分の考え方はあながち間違っていなかったんですかね。
SDKにはない特殊なソースが隠れていてそれでHWNDを判断するみたいな。
ウィンアプリはだいたいwindows.hで全て出来るけど、
afxwin.hと別のヘッダーを利用している所からも特殊なんでしょう。
770759:04/05/08 18:06
>>768
ありがとうございます。調べてみます。
771デフォルトの名無しさん:04/05/08 18:09
 質問で申し訳ありません。

開発言語は「Visual Basic 6.0」です。
OSは「WindowsXP Personal Edition」です。
「RasDial」でRASの接続を行い、
「RasHangUp」でRASの切断を行う処理を行っております。
プログラム起動をして初回の接続は問題無く動作し、
切断する事も出来ます。
ですが、続けて同じRASに接続しようとした場合
エラーコード「668」(接続を終了しました。)
が返されてしまい、接続する事が出来ません。
「Windows98 Second Edition」では正常に動作しておりました。
この現象について何かご存知の方はいらっしゃいますでしょうか?
ドライブはGetFileAttributesで取得すると
属性はFILE_ATTRIBUTE_DIRECTORYなんですか?
Windows2000以外でも同じですか?
WindowsXP Personal Editionってなんだよ(w
Officeと混ざったんだろうな。
ググって見ろ。
5件もヒットするぞ。(藁
776デフォルトの名無しさん:04/05/08 21:43
HOMEでした。すいません。
>>775
ワロタ
関係ないが、Office XP Home Editionというのも
>>759
GetWindowLong()じゃだめなの?
hInstance = (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE);
みたいにすれば得られるけど。
どこかにWinのバージョンごとに
入っているフォントと初期フォントを
紹介したサイトはありませんか?
781780:04/05/09 09:50
知りたい理由というのは、
フォントを利用したツールを作ろうと思っていて、
ユーザーに独自のフォントを使わせたくないんで。
…スレ違いだったかな?
>>781
擦違い
以下のプログラムはビットマップを表示するものです。
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=999294620&res=149

タイプ1が1セルずつ表示するバージョンで、
タイプ2が表示する内容を別の所に記憶しておき最後に一度で表示させようと
した物です。タイプ2の方が表示されないので正しいやり方を教えてください。
なお、ビットマップが添付されてますのでソースと同じフォルダに置いて下さい。
784783:04/05/09 18:20
質問なので上げさせてください。
ageさせてあげますが答えてはあげません
>>783
ビットマップがない。>>539と同じ問題。
>>783
スレ違い。
788783:04/05/09 18:27
>>786
>>539周辺を読んでみます。

>>787
誘導してください。
789783:04/05/09 18:37
>>786
こんな感じでやってみたのですがダメでした。
もう少しヒントをください。

SelectObject(hDCBitmap, hBitmap);
for(x=0; x<20; x++)
for(y=0; y<20; y++)
{
BitBlt(hDCBack, x*16, y*16, 16, 16, hDCBitmap, 0, 0, SRCCOPY);
//Sleep(1);
}
DeleteObject(hBitmap);

SelectObject(hDC, hDCBack);
BitBlt(hDC, 0, 0, 320, 320, hDCBack, 0, 0, SRCCOPY);
DeleteObject(hDCBack);
LoadImageの使い方おかしくないか?
だから、hDCBack が 320x320 の大きさのビットマップを
SelectObject() してないと、hDCBitmap から hDCBack に blt すると
きに描画先が足りないっしょ?
>>783
HDC hDCBitmapに対応するHBITMAPはhBitmap。
同じように、HDC hDCBackに対応するHBITMAPを設ける必要があるよ。

791が言っているのは、
HBITMAP hBmpBack=CreateCompatibleBitmap(hDCBack,320,320);
SelectObject(hDCBack, hBmpBack);
が必要だってこと。
793783:04/05/10 12:25
ありがとうございます。

>>792
黒に白い線が入った感じで表示されてしまいます。どこがいけないのでしょう。
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=999294620&res=150

後、同じような事をやっているプログラムを見つけたのですが、
それでも同じような感じで表示されます。
http://www3.omn.ne.jp/~renas/Win32/Win32_08.html
>>793
コンパチビットマップを設定する順序が無茶苦茶だと思われ。
>>794も原因の一つだが、
CreateCompatibleBitmapで指定するHDCは大元のHDCを指定する必要がある。
MSDNのCreateCompatibleBitmapの解説をじっくり読みましょう
796783:04/05/10 13:18
>>794
ありがとうございます。順番をいろいろ変えて実験してみます。
797783:04/05/10 13:20
>>795
ありがとうございます。
大元のにしたら、まだ正しくは表示されませんが色が付きました。
798783:04/05/10 13:41
表示できました。ありがとうございました。
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=999294620&res=151
799デフォルトの名無しさん:04/05/10 16:39
一定時間放置されたらダイアログを終了させたいと思っています。

このダイアログにはIEコンポーネットが貼ってあるので、できれば
システム全体かダイアログ全体のイベントとして処理したいのですが
普通はどのように実装するものなのでしょうか?

対象はWinCE(HPC2000)ですが、基本は同じだろうと思って
ここに書きました。

よろしくお願いします。
>>799
WM_TIMER
>>799
何を放置か知らないけど、>>800さんの意見+放置対象を監視すると桶。
リストボックスのどれが選択されているのかを判定するのって
X = (int)SendDlgItemMessage (hDlg, IDC_LIST, LB_GETCURSEL, 0, 0);
であってます?
どれ選んでも0が代入されちゃうんですけど・・・
803デフォルトの名無しさん:04/05/11 00:21
 
804デフォルトの名無しさん:04/05/11 00:25
winsockつかってUDPでチャット作ったのですが、
同じマシン内でサーバとクライアント立ち上げたときは反応しますが
違うマシン同士では反応しません。
IPとかポートはちゃんとしています。
原因はUDPつかってるからでしょうか。
よろしくお願いします。
>>804
ポートってTCPのポートだったら笑えるな。
そもそもチャットにUDP使うこと自体がおかしい。
UDPは転送も、順番も保証がない。
それとネットワークプログラミングスレで聞け。
807804:04/05/11 01:08
すれ違いでした。すみませんでした。
リストビューを表示中にその内容を書き換えたく、以下のようにしているのですが、

void Update() {
  ListView_DeleteAllItems(m_hLV);
  for (...) {
    LV_ITEM lvItem;
    ...
    ListView_InsertItem(m_hLV, &lvItem);
    ...
  }
}

DeleteAllItemsをしたときにスクロールバーが戻ってしまいます。

スクロールバーが戻らないように表示内容だけ更新する方法はないでしょうか。
809808:04/05/11 03:55
すいませんsageてしまいました
>>808
変更のあったアイテムだけ書き換えるんじゃだめなの?

あとは、大量のアイテムを追加したりするときのために
描画を停止させる方法があった気がするけど、
スタイルだったっけなぁ・・・?
811808:04/05/11 04:37
>変更のあったアイテムだけ書き換えるんじゃだめなの?

DeleteAllしないでInsertすると項目がどんどん追加されてしまうし、
どうしたら変更のあったアイテムだけ書き換えることができるでしょう?
ListView_SetItem
ListView_SetItem、ListView_SetItemText
お好きな方をどうぞ。

前から疑問に思っていたのだけど、質問するときにスレを上げるのって何か意味があるの?
ローカルルールなら仕方ないと思うんだけど、たまにムカっとくるんだが。
>>813
2ちゃんブラウザ使ってるとそう思うときもあるけど、
IEとかネスケ使ってる場合、ageてくれないと見つけづらいからね。
記事が目に付かないと答えがもらえる可能性も低くなるし。

最近は見ないけど、質問するときはageとけっていってる人もいた。
スレをsageる方にこそ意味があるのかと
さらしあぐぇ
817デフォルトの名無しさん:04/05/11 05:53
>>813
>ローカルルールなら仕方ないと思うんだけど、たまにムカっとくるんだが。

ほう。どうしてムカつくのかね?
>>815
私もちょっと思う。

けど、sage
>>815>>818
仮にも技術板なんだし、
質問やニュース系がageで、普通の雑談はsageにしたほうが
利便性高い気がしなくもないけど。
普段からageてると、質問が埋もれるし。
820デフォルトの名無しさん:04/05/11 06:49
age書き込み=荒らしだと信じ込んでいる人は困る。
だれもそんな事は言ってない。
822デフォルトの名無しさん:04/05/11 08:02
>>821
2ch中にたくさんいるだろうが。
2ch中なんて見て回る余裕内
いや、つーかスレと関係ない話題はyosoでやってくれんか。
825デフォルトの名無しさん:04/05/11 10:29
そうだそうだ
飲むソーダ
>>824
yoso送り
このスレは見てる人多いんだからageて目立たせなくても教えてくれる人は居るかと。
それでもageるのは質問スレの慣習かな。
なんかage=悪って洗脳されてるやつがいるな。
「デフォルト=悪」ということらしいねw
でも、age進行のスレで関係ない質問が紛れ込んだことはあった。
プログラム板だからどれも同じと思ったらしいが。
>>830
漏れのブラウザでは、sageがデフォルトなんでつが・・・
2chのデフォルトっつー意味だって事ぐらい分かるだろ。
技術系板では2chブラウザを使って当然、それらのデフォルトのsageで投稿して当然だと思うけど?
脳が涌いているようでつね。
使ってるソフトウェアのデフォルト設定だから、ってのは思考停止だと
思うぞ。

ところで、8bpp 以下の DIB のパレットの扱いがよくわからん…。どっ
かにいい解説はないもんだろうか。

とりあえずPetzold本の下巻
2chだろうがブラウザだろうが「デフォルトだから」ってのは頭悪そう
840836:04/05/11 17:20
>>836
あーいや、BMPのファイルフォーマットは理解してるんです。

CreateDIBSection() で DIB_PAL_COLORS したときにどんなパレットが
HBITMAP の中に記録されているの? とか、GetObject() で DIBSECTION
が取れるけど、DIBSECTION にパレット情報が含まれないのはなんで?
とか、GetDIBColorTable() に HDC が必要なのはなんで? とか。

>>840
パレットはビットマップじゃなくてデバイスコンテキストの属性だから。
842836:04/05/11 18:05
DIB_RGB_COLORS で CreateDIBSection() するときはパレットの情報も
渡してるよね? そのときに渡したパレットの情報は HBITMAP の中には
保持されてないってこと?

>>842
そうですよ。
っていうか841に書いたように「パレット」はデバイスコンテキストの属性なんだってば。
844843:04/05/11 18:36
ん、なんか自信無くなってきたぞ・・・
いや、パレットの情報なんか渡されないし。
CreateDIBSectionとかで指定するのは、ビット列がどんな色情報を
持っているかだけで、その後のパレットとは関係ない。
846836:04/05/11 19:53
SetDIBits() や GetDIBits() ではとくに疑問はないんです。

>>845
CreateDIBSection() ではピクセルのデータは入力しないから、その説
明だと bmiColors の情報は全く何にも使われないことになっちゃいま
すよ。
MSDN の説明を読む限りでは、DIB_PAL_COLORS でも DIB_RGB_COLORS で
も bmiColors のテーブルには意味があるはず。
あー、もうウザいから、君の理解している「パレットの定義」を書いてくれ。
848836:04/05/11 22:57
パレットちうのは、ピクセルデータから RGB 値に変換するテーブルのことさー。

DIBSection な HBITMAP の場合、
・CreateDIBSection() で DIB_RGB_COLORS のときに bmiColors に入って
いるもの
・CreateDIBSection() で DIB_PAL_COLORS のときに HDC が SelectPalette()
してるHPALETTE と bmiColors に入っている WORD 配列
・その HBITMAP を SelectObject() した HDC が SelectPalette() してる HPALETTE
・GetDIBColorTable() と SetDIBColorTable() で出し入れできるもの
これらの関係はなにさ? ということ。
>>847答えられなくなったからキレた。
850843:04/05/12 13:31
>>848
bmiColors にある clut が意味を持つのは、StretchDIBits や SetDIBits などで使うときだけ。
CreateDIBSection で得られた HBITMAP は、旧来の GDI 的には旧来の HBITMAP としてしか
扱われないので、HBITMAP を用いる場面では SelectPalette 等する必要がある。

>・CreateDIBSection() で DIB_RGB_COLORS のときに bmiColors に入っているもの
>・GetDIBColorTable() と SetDIBColorTable() で出し入れできるもの
この2つは同じ化も知れない。

あとは全て相互に無関係。
まぁ普通はプログラマが意識して一致させるだろうけど。
>>849に同意w
それはさておき、本題を書きましょうか。

まず、少し混同しているようだが、パレットとカラーテーブルは別物。
CreateDIBSectionで作られるHBITMAPの中にあるのはカラーテーブル。
CreatePaletteなどで作るHPALETTEがパレット。

CreateDIBSectionのiUsageはそのカラーテーブルをどう作るかを指定してるだけ。
GetDIBColorTableなどでいじってるのも、関数の名前どおりカラーテーブル。

実際画面に表示する時には、このHPALETTE内のパレットと、DIBSection内の
カラーテーブルとをカラーマッチングして表示してたと思う。
852デフォルトの名無しさん:04/05/12 15:14
VBからの呼出ですがよろしくお願いします。

ImmGetConversionListを使ってIMEでの変換候補を取得しようとしています。方法は
ttp://www.mitene.or.jp/~sugisita/vb6_ime.html
の「IMEの変換候補の取得」をそのまま流用させて頂いてます。

ところがたとえば平仮名の”あ”について変換候補を取得すると
亞、亜の2つしか取得できません。メモ帳で”あ”を変換すると私の環境では
亜、亜、ア、あ、阿、ぁ、蛙、唖、ァ、吾の10個の候補が出てきます。

どうやったら10個全て取得できるのか教えてください、よろしくお願いします。
853名無し@沢村:04/05/12 16:00
おまいらよ、いまだにビットマップの表示ごときで議論してるのか?
ビットマップの表示ごときで議論することが何かあるのか?
おまいらに、幼稚園児の称号を与えてもいいか?
つまらんアセンブラ解説サイトなんか作ってないでもっと実用的なモノやれよ。
PE解析に役立つアセンブラ、とかさ。
(ノ∀`)アチャー
嘘を嘘と(ry
つまり本物だろうと騙りだろうとネタだろうと嘘だろうと

   沢 村 に レ ス す ん な
>>857
お前に指図はされない
俺にも指図はされない
俺は指図しない
861デフォルトの名無しさん:04/05/13 09:52
指定フォルダの中にフォルダがあるかどうかをみるって
FindFirstFileで調べないとダメ?もっと簡単なAPIってある?
教えてエロエロな人
おまえに指図される
俺にも指図してよ
指図してください、ご主人様。

ところで、
>>861
FindFirstFile とかでぐるぐるするぐらいしか思い浮かばないわ。
じゅうぶん簡単な方法だと思うの。
名前わかってるなら、ぐるぐるする必要は無いだろ。
866デフォルトの名無しさん:04/05/13 12:19
>>864
だよなぁ
>>865
ちげえって、指定フォルダん中にさらにフォルダあるかどうかってきいてんあああああああああああああああああばかあああああああああ
サブフォルダがあるかどうかはシェルAPIを使って
SFGAO_HASSUBFOLDER
のビット見ればいいだろ。
複数行描画、クリッピング機能、DT_EDITCONTROLを使いたくてDrawTextを使ってるんですが、
この関数は連続して文字を書きたいときに、カレントポジションを更新してくれないので
代わりになるような関数とかってありますか?

もしくはDT_EDITCONTROLでやってる計算方法とかわかれば関数を自作してみますけど・・・
DT_CALCRECTじゃ矩形しかとれないんですよね?


#「FindFirstFile とかでぐるぐるする」って表現、なんかかわいいw
>>867
お、そんな便利なものがあったのか、と思ったら、COM かあ。
>>869
COMかどうかなんか気にする必要はないぞ。
普通にヘッダインクルードしてライブラリリンクすれば使える。
そもそもAPIなんかほとんどDLLなんだし。何が問題?
参照カウントとかQueryInterfaceにアレルギーがあるんじゃないの?
そこでATLですよ
しかし生APIとは言えなくなる罠
ATLの方が厄介でしょ。
相手先の環境によっちゃ、DLL配らなきゃいけないし。
COM でやるんなら、FindFirstぐるぐるでも手間かわらないんじゃ?
875デフォルトの名無しさん:04/05/13 15:17
>>867
髪!!
さんくす
>>868
TEXTMETRIC使ってこねこねじゃダメかしら?
877868:04/05/13 17:19
文字列A="あいうえおかきくけこ\nさしすせそ";
文字列B="ぱぴぷぺぽ";

だとすると、

あいうえおかきくけこ
さしすせそぱぴぷぺぽ

のように表示させたいんですよね。


>>876
自分もTEXTMETRICとかでこねこねしたいんですけど、
DT_EDITCONTROL、つまりエディットコントロールの表示方法に合わせたいので
エディットコントロールがどうやって座標計算してるのかが分からないので・・・

でも、レスありがとうございます。
今まで相手にされてなかったので(´・ω・`)してまスた。
>>873
なんでスタティックリンクしないの?
>>877
毎回全部描く。
Win32APIでJPEGの表示ってサポートされていないんですか?

したらどうやってC/C++でJpegを表示するのだ。
VBでいうピクチャーボックスみたいなコントロールあるんですか?
お魚は最初から切り身になっているのではありません
なんかJPEG,PNGの質問って定期的にでるな。
>>880
表示できます。頑張って探して下さい。
ネタとしか思えんよな
実は質問してるのは全部同一人物で、忘れるたびに聞きにきている。
886名無し@沢村:04/05/13 21:28
>>880
JPEGを扱うWin32APIはないよ。
だがJPEGをビットマップに変換してやれば簡単に表示できるよ。
887880:04/05/13 21:40
ネタでした。
多々こういう質問があることも知っている。
できないのくらい知っているわ
なんでい、お前らは。
いたすぎるんだよ、発言が。
夜まわりしているような老人の脳みそしかないんだな?藁
縦横に文章作るって大変だな。
BI_JPEG と BI_PNG が混乱を招いてるような気も。
タ々きんたま、か。
891名無し@沢村:04/05/13 21:51
みなみなさまがた〜教えてくださらんか〜みなみなさまがた〜♪
リッチエディットでキーワードを色づけするにはどうしたらいいの?
FindTextで選択状態にして色づけ→それを繰り返す、ってのはナシで頼むよ。
みなみなさまがた〜教えてくださらんか?
892デフォルトの名無しさん:04/05/13 23:26
IME2000のユーザ辞書に登録されている単語(?)を取得して、
IME2002及びIME2003に登録したいんですが、どーやれば良いんでしょう?
ググってみても...なーも出て来ないし..._| ̄|○

『IMEの辞書登録から抽出して、それから登録』ってのは無しの方向で...
Imm〜関数で出来るんですかね?

誰か教えてくだされ<(_ _)>
>>891
write RTF by your self.

>>861

it's most easy way.
894名無し@沢村:04/05/14 01:31
>>886
OleLoadPicture() ♪
>>877
lstrcat()つかう
>>894
それはWin32APIじゃなくてOLEだっての
>>896
屁理屈言ってんじゃねーよ。
>>897
それが屁理屈ならDirectShowを薦めてもいいのか?
>>898
本当に屁理屈ばかり言う奴だな。
DirextShowとは性格が違うだろ。
OleLoadPictureはWin32 SDKに標準で入ってるから、Win32APIでいいのさ。
>>899
んだね。
WindowsOSに標準で入ってるし。
流れぶった切ってすまんが、
自分のIPアドレスを取得するAPIってありますかな?
あったらおしえてくだされ。
GetIpAddrTable
>>899,900
どういう性格をしたAPIならいいの?
DirectShowが屁理屈なのは分かってるけど、
それでもWin95(OSR2以降だったか)にも標準で入ってたはずだし、
DirectX SDKを入れなくても利用できる。
かたや、OleLoadPictureだってWin32sじゃあ動かない。

テキトーな感覚でOleLoadPictureはよし、
DShowはダメみたいに切り分けてるのが納得いかないだけだ。
>かたや、OleLoadPictureだってWin32sじゃあ動かない。
必死すぎ
おいおまいら、必死杉はレバノン杉に次いで伐採による絶滅が危惧されているものなので
もっとやさしく扱ってやらないとグリーンピースがRMSと一緒に縦笛吹きながら攻めてきますよ。
Win32sはつらいな。せめてNT3.5とかさ。

ttp://www02.so-net.ne.jp/~okuda/tech/oleaut32/
によるとデフォ状態のWin95OSR2ぐらいではoleaut32には含まれず
olepro32に入ってるもののようだから、非常に標準的なWin32 API
であるとは言い難いのかもしれない。
TAとTAを接続してデータをやり取りをするソフトを
作成しようと思い、とりあえず、ハイパーターミナル同士を
接続したのですが、文字を打っても相手側に表示されません。

なにかプロトコルなどがあるのかとおもいますが、ソフト作成
時に使用するDLL、APIなどがあれば教えていただきたいのですが
よろしくお願いします。
的はずれ
>>902
d
>>907
PC-TA-TA-PCと言う状態?
だったら、電話線ぶった切ってクロスにして、
片方で「ATD」もう片方で「ATA」コマンドを送れば繋がらない?
アナログモデムはその方法で繋がったと思うけど。
>>904
言い返せなくなると、必ず必死だなって言うよなw

だけど、明確な線引きも出来ないくせに、根拠も示さず
自分は正しいお前は正しくないって言うのはどうかしてるよ。
>>910
「ATD」「ATA」で繋がってはいるのですが(CONNECT状態)
その後、アナログモデムの場合は文字を送れるのですが、
TAだと送れないという状況です。
>>911
Win32sはぶっちゃけありえない
>>911
そんじゃDirectXやMFCなどは専用スレがあるんで
ここではスレ違いという線引きでお願いします。
>>912
あのねー、TAの通信はモデムとは違うよ。
デフォルトはたぶん同期通信だよ。
シリアルポートとの間で同期-非同期PPP変換をやってくれる。
これが確かV.120。

非同期モードにしないとモデムのように無手順でデータをやり取りすることは出来ない。
こっちはV.110だと思った。
懐かしい話だな。
>>915
どもです。
同期でやるにはHDLC手順でやり取りしないと
いけないのかな・・・

なんかわけわかんないからやめよう・・・
917デフォルトの名無しさん:04/05/14 20:16
DialogにMenuを追加したいのですがどうすればいいのですか?
おせーて
>>914
COMスレもありますよ。
>>917
リソースエディタでメニューを作成。
ダイアログのプロパティを開き、
「メニュー」に作成したメニューのIDを選択。

920デフォルトの名無しさん:04/05/14 20:50
数当てのゲーム?っぽいの作ってるんですけど
乱数を表示する方法がわかりません。
どうすれば・・・
>>919
なるほどこんなに簡単な作り方だったんですね。
分からないから..rcをテキストで開いて自分で書いてました。
今度からは上のやりかたしてみます。
>>920
MessageBox("乱数")
ワラタ
924デフォルトの名無しさん:04/05/14 21:32
今、BMPファイル全体のRGB値の平均を出すプログラムを書いてるんですが、
BMPファイル(24bit)で、行が変わるところに0x00が二つ入ってるものと入ってないものがあって困ってます。
二つの違いはなんなのでしょうか?どなたか教えて下さいまし。m(__)m
>>924
一行のバイト数は4の倍数
926デフォルトの名無しさん:04/05/14 22:06
>>922
Σ(゚д`*;)アッ,アハァ?
>>924
1ラインのサイズ(byte)は4の倍数でなければならないから
横サイズと色深度によっては末尾に余計な物がつくことがある。
928924:04/05/14 23:08
>>925,927
ありがとうございました。そういう仕組みだったんですね〜
>>920
とりあえずWin32APIというよりもお使いの処理系の標準ライブラリに
乱数を返す関数くらい入っていると思われ。。。
VisualC++ならrandとかVBならRndとか。
930デフォルトの名無しさん:04/05/15 01:36
>>903
常識的に考えたらWindows SDKの中に入ってるやつだろ。
http://www.microsoft.com/msdownload/platformsdk/sdkupdate/

よって
OleLoadPictureは○
DirectXは×
ついでにGDI+は○
931デフォルトの名無しさん:04/05/15 03:21
こんばんは
今で話題に上げっている内容とは違った質問なってしまいます.
FindFirstFile関数、FindNextFile関数を使って "D:\"以下(サブフォルダ含む)のテキスト
ファイル(*.txt)を全検索しています。
通常両関数が返す構造体 【WIN32_FIND_DATA】の中の変数 「cFileName」にはフルパス名では
ファイル名のみが返ってくると思います.

そこで、
FindFirstFile関数で取得したファイルハンドル等を使用してファイルのパス名(フォルダ名)
を簡単に取得する方法は何かないでしょうか?

ウィンドウ関連だったら
ウィンドハンドルから該当の実行ファイル名、ウィンドウテキストやウィンドウクラスを取得
する事が出来るのですが...。

どなたかご存知でしたらよろしくお願いします。
VB使っています。
>FindFirstFile関数で取得したファイルハンドル
は?
>>931
MSDNを何万回も読み直した方がいいよ
>>931
フォルダ名だったら最初からわかってるじゃねーか
935デフォルトの名無しさん:04/05/15 03:48
すみません。
場違いな質問内容だったみたいなので出直しておきます。
フォルダパスわたしてファイルみつけてそのファイルのあるフォルダパスは?

とんち?一休さーん!
937デフォルトの名無しさん:04/05/15 04:11
>>936さん
すみません。
未熟なものでイメージが全然湧かないです。
具体的な実コーディング方法または記載されているサイト等があれば教えて下さい。
>>937
なあ、一セットの FindFirstFile/FindNextFile
でサブフォルダまで一気に検索してくれると思ってない?
ttp://www.sm.rim.or.jp/~shishido/subdir.html
俺はここのを参考にした。
system("find dir -type d");
942デフォルトの名無しさん:04/05/15 10:45
どうもありがとうござします。
ご参考にさせて頂きます。
>>942
よく見ると、不思議な敬語だね。
参考にするのは自分自身、あげちゃいけないね。
ご質問させてください!
ご丁重に断ります!
>>945
ずいぶん偉そうですね。
PostMessageが失敗したときってどうすりゃいいの
あきらめろ
950949:04/05/15 14:09
誤爆スマソ
質問です。
WM_CREATEメッセージのところで、
CreateWindowを用いてボタンを作ったんですが
WM_PAINTメッセージが来たところで一度BeginPaintしないと
表示されません。
また、ボタンをオーナードローで書いてみようと思い、
WM_DRAWITEMメッセージにブレイクポイントを仕掛けても
止まらないんですが、これって何がダメなんでしょうか。
教えて、エロイ人!
952951:04/05/15 15:20
すんません・・・
激しく自己解決しました・・・・・・
953デフォルトの名無しさん:04/05/15 18:26
dword型とは?
>>953
謎掛けですか?
Byte型とは?
Word型とは?
DWord型とは?
QWord型とは?
TByte型とは?
>>955
それらは見たことがあります。
俺だって見たことがある。
男とはなんぞや…
ダブルワード型変数によくdwHogeって名前付いてるけど、
バイト型変数には何つけるの?byHogeとか?
なるほど、変換ミスを放置するような香具師にはハンガリアン記法も必要だと言うことですね。
リソースからBMP表示できるようになったんだけど、
2種類以上のBMPが表示できまへん。
教えてかっこいい人
MessageBox等のOKやキャンセル等のプッシュボタンを
旧来のではなくてXP風のマウスのポインタを合わせるとボタンの周囲がオレンジで
ふちどられるようにするには通常のMessageBox()では実現可能なのでしょうか?
ファイルをバイナリモードで開く方法を教えて下さい
fopen("filename","b");
>>965
いくらなんでもそれはないだろう……
SDKでfopenは互換性があるのですか?
>>964
Windowsには「バイナリモード」などというものは存在しません。
フツーにCreateFileで開いてください。

テキストストリームの行区切りが\nであると定めているのは、あくまで
「C言語の」仕様に過ぎない。それに合わせるために、MS-DOSだのWindowsだの
MacだののCのランタイムでは、わざわざテキストモードだのバイナリモード
なんてのを用意して、改行を\n一文字に見せてるワケ。
\r\n・・・Win
\n・・・Unix
\r・・・Mac
だっけ?
元々印刷の時に復帰、改行の問題があったんだよ。
改行だけでよかったのが復帰がないと間に合わないってだけで作られた過去の遺産。
>>969
OSの改行の扱いの違いと、言語仕様の違いはまた別の話だな。
Cがテキストストリームをタイプライタ式で行区切りを\nと定めてるのは、
単にUNIXがそうだから、と言ってしまえばそれまでだが、
むしろ昔の固定長レコードのデータセットが主流だった計算機への反逆じゃ
ないんかと。FORTRANとかCOBOLとかの入出力仕様はモロにその頃のアレだよね。
そういう時代では、そういう腐った入出力レイヤを抽象化・単純化して
扱いたいという発想は極めて自然なものだったんだろうと思う。
後は、計算機で扱う主要なデータがテキストであったとか、むしろテキストに
したかったとか。
他にも過去のしがらみに縛られてるのがたくさんあるからな。
多少互換性無視してでも断ち切ってもらいたいよ。
>>967
言ってる意味がよくわからんが
いわゆるSDKスタイルで書いてる、WinMain()ではじまるような
ウィンドウアプリケーションでfopen()を使えるんですか?という
意味なら、勿論使えるよ。ただし、Cランタイムをリンクすれば、
という条件つきだが、まあ普通のコンパイラなら何もしなければ
デフォでリンクする。

ただし、あなたが書こうとしてるのがDLLやインプロセスCOMサーバ
の類なら、使えないことはないけど、いろいろ問題があるからlibcに
依存するのはなるべく避けたほうがいい。
>>972
というか、ここはCスレじゃないからそもそも使えない可能性が・・・
>>964
Open "FileName" For Binary As #1
975963:04/05/16 01:34
すいません自己解決いたしました_| ̄|○
>>972
ということはWinアプリケーションは
stdioのようなCライブラリもランタイム結合なんですか?
それとも実行ファイルの段階でCライブラリは静的結合されているんですか
>>976
そんなもん処理系次第。VC++なんかはどちらも選べる。
>>977
レスありがとうございます。
ということは
実行ファイル+DLL(Cランタイムライブラリ・WINAPI)
実行ファイル(Cライブラリ)+DLL(WINAPI)
のどちらになるか、またはオプションになるかは
処理系依存ということですね
>>978
「Cランタイム」つーときの「ランタイム」は、別にDLLとは関係のない
概念で、ちょと意味が違う。
言語サポートのために実行時に呼ばれるライブラリ関数群という程度の意味で、
DLLとして実装されてるかスタティックリンクライブラリとして実装されてる
かは問題ではない。
>>979
2chの教えてレスで
ここまで丁寧にレスをもらったのは始めてです
すっきりしました!
またまた質問です
コンパイラはMingwなんですが、MingwがリンクするCランタイムライブラリは
msvcrtとlibcのどちらなんでしょうか?
982981:04/05/16 10:50
すいませんMingwがリンクするじゃなくて
MingwでコンパイルしたWinアプリがの間違いでした
983981:04/05/16 10:55
自分で行ってて訳分からないや・・orz
つまり、動的にリンクするライブラリが
コンパイラ付属のlibcとmsvcrtの2つあるのが、なんか?なんです。。。
Mingwで作成したバイナリをDependency Walkerで見れば一目瞭然。
処理系依存な質問ですが
Mingwは独自LIBCをいつ使うんですか?
静的リンクの時ですか
処理系依存だと分かってるなら該当スレで聞け阿呆
987 ◆Manna2uCLg :04/05/16 12:55
こっそり次スレ立て......
988 ◆Manna2uCLg :04/05/16 13:11
……規制中だったょ…
だれかよろしこ…

ちなみに、当方 plala でつ…
MinGW は常に msvcrt をダイナミックリンクで使う。
スタティックリンクはできない。独自 libc を持つ予定は
いまのところない。
>>989
gooooooooooooooooooood job!!!!!!!!!!!!
>>989
オプションで crt, VC6, VC7 の DLL にも切りかえれるけどな。
992デフォルトの名無しさん:04/05/16 16:39
>>955
byte型は分かります
dbyteはdouble byte型ですよね?
dwordはdouble wordで
word型とはナンですか?
>>992
(゚Д゚≡゚Д゚) dbyteはどこからキタ

word は byte 2ヶ
#define DBYTE WORD

case sensitiveな言語の話をしているときに混乱するようなこと書くなよな。
996デフォルトの名無しさん:04/05/16 17:24
>>993
dbyteなんて書いてありませんでした
有難うございます
997デフォルトの名無しさん:04/05/16 17:46
DWORD = unsigned long
desuka?
環境依存
↓1001
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。