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

Win32API質問箱 Build18

■ このスレッドは過去ログ倉庫に格納されています
0001 ◆Manna2uCLg NGNG
スレ立てるまでもない、Win32APIについての質問はこちらへどうぞ。
やさしいオジサマ達が、熱く暑く答えてくれよう。
でも最低限、最新スレくらいは質問する前に検索を。
過去スレ・参考は>>2-5くらいを参照するッス!
0446デフォルトの名無しさんNGNG
>>445
だから自分でちまちま既存のコントロール組み合わせて作れっていわれてんだろ。
0447デフォルトの名無しさんNGNG
WC_LISTVIEWを指定しろ
てかここのアマグラマは使えないな
0448デフォルトの名無しさんNGNG
>>445
COM ATL ActiveX

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

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

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

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

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

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

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

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

ウィンドウごとに別のプロシージャを使いたいので、
WNDCLASSを新しく作るしかないと思ったんですが、ほかに方法があったりするのでしょうか?
0468デフォルトの名無しさんNGNG
>>467
知ってるよ。
コントロールを作るのは練習だ、練習。
エディットコントロールは、EDITという名で
WNDCLASSが登録されてるの。
0469460NGNG
サブクラス化しようとしたができませんでしたが、
なんとなくで新しく作るWNDCLASSのhInstanceに
メインのウィンドウのインスタンスと同じものをいれたら普通に通りました
ご迷惑をおかけしてすみませんでした^^
0470デフォルトの名無しさんNGNG
こういうやつっていったい何を資料にしてるんだろw
0471404NGNG
結局、WS_CHILDで子ウィンドウ作る事にしました。
とっても簡単・確実。
0472デフォルトの名無しさんNGNG
Windowsタスクマネージャーのアプリケーションのところに
作ったアプリケーションを表示させないようにするにはどのWSを
消せばいいの?
0473デフォルトの名無しさんNGNG
WS_EX_TOOLWINDOWだっけな。
0474デフォルトの名無しさんNGNG
物凄い黄金アマグラマ群が湧いてるようだな
0475デフォルトの名無しさんNGNG
まだ表示されるんですけど
0476デフォルトの名無しさんNGNG
>>475 ウィンドウスタイルに「追加」
0477デフォルトの名無しさんNGNG
>>474
春だからね。
0478デフォルトの名無しさんNGNG
>>477
GWだからだと思う。
0479デフォルトの名無しさんNGNG
>>472はタスクマネージャから消したいんだろ?少なくとも俺はどうすればいいか分からない。
サービスにしてsvchostあたりから動かせば可能かもしれないが方法によってはそれでも見れる。
0480デフォルトの名無しさんNGNG
>>479
「アプリケーション」タブに非表示 == タスクバーに非表示
「プロセス」タブじゃない。
0481デフォルトの名無しさんNGNG
そもそも、見えないようにする意図がいまいちピンと来ないんだが。
0482デフォルトの名無しさんNGNG
>>481 愚か者
0483デフォルトの名無しさんNGNG
今までプログラムしたことない新人さんも大量に発生しているからな。
俺も、初GWはプログラミングの勉強に費やした。
0484デフォルトの名無しさんNGNG
>>483
0485デフォルトの名無しさんNGNG
大量の学生をウォッチ出来るスレはここですか?
0486デフォルトの名無しさんNGNG
>>481
典型的にはタスクトレイ常駐型アプリだろ。
ついでに非表示ウィンドウを親にするという手もある。
0487デフォルトの名無しさんNGNG
なんか、ぐだぐだだな。
0488デフォルトの名無しさんNGNG
タスクマネージャとタスクバーの区別がつかない奴がいるスレはここですか?
0489デフォルトの名無しさんNGNG
bigenPaintでヘアカラーする奴がいるスレはここですか?
0490デフォルトの名無しさんNGNG
もともとそんなにレベルが高いスレじゃなかっただろ
それとも叩いてるほうも学生なのか?
0491デフォルトの名無しさんNGNG
>>488
それはお前だけ
0492デフォルトの名無しさんNGNG
>>489
いやそれはここじゃないって
0493デフォルトの名無しさんNGNG
>>492
>>240
0494デフォルトの名無しさんNGNG
部屋カラー?
0495デフォルトの名無しさんNGNG
ちがう
0496デフォルトの名無しさんNGNG
タスクトレイ常駐型でもタスクマネージャのアプリケーションタブのとこに
出る奴と出ない奴があるけど、あれは何が違うん?
0497496NGNG
あ、今自分でわかったからいいや。今のなし
0498デフォルトの名無しさんNGNG
>>497
そういう情報は横展開しましょう。
0499デフォルトの名無しさんNGNG
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();
0500デフォルトの名無しさんNGNG
lpBitmapInfo + sizeof(BITMAPINFO)
↓
lpBitmapInfo + 1 もしくは hGlobal + sizeof(BITMAPINFO)
0501499NGNG
>>500
ありがとうございました。そんなところだったとは。
で、今度は色がおかしくなったんですが、
lpBitmapInfo ->bmiColors->rgbBlue= 0;
lpBitmapInfo ->bmiColors->rgbGreen= 0;
lpBitmapInfo ->bmiColors->rgbRed= 0;
lpBitmapInfo ->bmiColors->rgbReserved= 0;
は、あってますか?
0502デフォルトの名無しさんNGNG
>>501
パレットを使わないのなら、BITMAPINFOじゃなくてBITMAPINFOHEADERを使え。
0503デフォルトの名無しさんNGNG
>>498
俺も知りたい。教えてください>>496
0504499NGNG
>>502
BITMAPINFOHEADER でうまくいきました。
ありがとうございます。

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

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

分らない物を使うな
0508デフォルトの名無しさんNGNG
ここまでくると逆におもしろい。
ウチの新入社員だったら笑えないけど。
0509野次馬NGNG
>>507-508
分からずに使って、バグが出たらどうするんでしょ。
楽しみ。ホント。
0510デフォルトの名無しさんNGNG
>>506
http://msdn.microsoft.com/library/読むか
http://www.microsoft.com/msdownload/platformsdk/sdkupdate/を入れて同梱のドキュメント嫁

0511デフォルトの名無しさんNGNG
GetSaveFileName()
で、保存するファイル名を取得して、
CopyFile()
で一時ファイルを保存したいのですが、

GetSaveFileName()
でディレクトリを移動させると、ファイルが保存されなくなります。
なぜでしょう。
0512デフォルトの名無しさんNGNG
はらたいらに3千点
0513デフォルトの名無しさんNGNG
>>511
何故って言われても普通はありえないので、動作しないコードをあげるべし。
0514511NGNG
よろしくお願いします。
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);
}
0515デフォルトの名無しさんNGNG
>>514
CopyFileの"tmp.jpg"という指定がカレントディレクトリのファイルを指すからだ。
0516511NGNG
コピー元、コピー先の両方が相対パス ---- ○
コピー元、コピー先の両方が絶対パス ---- ○
コピー元は絶対パス、コピー先は相対パス ---- ×
コピー元は相対パス、コピー先は絶対パス ---- ×

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

最も簡単で確実な解決法は、すべて絶対パスで表すことだけどな。
0518デフォルトの名無しさんNGNG
狙ったようなtypoだな
C:\TEST\tmp.jpg
0519511NGNG
GetSaveFileName がカレントディレクトリを変えるとは思ってもみませんでした。

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

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

ダウト。
0525デフォルトの名無しさんNGNG
要はカレントディレクトリなんか当てにするなってことですよ
0526デフォルトの名無しさんNGNG
絶対パス指定でDLLを読み込むにはどうすればいいんですか?
0527デフォルトの名無しさんNGNG
LoadLibraryに絶対パスを渡すだけだろ?
0528デフォルトの名無しさんNGNG
>>527
それでも同名のDLLを同ディレクトリに置いておくとDLLオーバーライドによって勝手にそっちが読まれませんか?
0529528NGNG
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.

というやつです。
0530デフォルトの名無しさんNGNG
それならはじめからそう書いてくれよ

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

Excelのような多機能List操作APIって無いですかね?
ListControlでは貧弱すぎて、使い物になりません。
0535530NGNG
>>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;
}
0536デフォルトの名無しさんNGNG
>>531
自分でファイルを読んでメモリ上に展開すれば良い
ハンドルの扱いなどの都合で関連APIをフックする必要があるかもしれない
0537デフォルトの名無しさんNGNG
絶対パス指定してもlocalがあればローカルを読みます。
0538デフォルトの名無しさんNGNG
MapAndLoad使え
0539デフォルトの名無しさんNGNG
質問いいですか?

メモリ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);//描画の終了
0540デフォルトの名無しさんNGNG
ビットマップがない
0541デフォルトの名無しさんNGNG
>>539
DCはただの製図道具。紙を用意しなきゃ何も描けん。
メモリDCの場合はビッマップをセットしてやれ。
0542539NGNG
>>540-541
失礼しました。

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

オフスクリーンを使った描画方法って無いのですか?
0543デフォルトの名無しさんNGNG
>>542
だからコンパチなビットマップを作れって。
0544539NGNG
表示されました。
Win32はこれまた回りくどいやり方ですね。

どうもでした。
0545デフォルトの名無しさんNGNG
ダイアログとフォームの違いはなんですか?
■ このスレッドは過去ログ倉庫に格納されています