1 :
デフォルトの名無しさん:
スレ立てるまでもない、Win32APIのついての質問はこちらへどうぞ。
やさしいお兄さんやお姉さんたちが答えてくれるかも。
過去スレ、関連リンクは
>>2-5くらい。
■注意
・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。
・日本語版MSDN Online Libraryは不完全です。英語版(
http://msdn.microsoft.com)の利用推奨。
・APIフックなど高度な事をしたい場合はできるだけAdvencedWindowsを読みましょう。
・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで。
作者がHSPの宣伝に必死です
8 :
デフォルトの名無しさん:2006/04/14(金) 08:05:57
質問です。
ウィンドウハンドルを関数で渡す事は出来ますか?
現在ウィンドウハンドルをポインタで渡して使おうとしていますが
ウィンドウハンドルを使用する関数を実行しようとすると
エラーを出して終了されてしまいます
超能力者plz
>>10 >ウィンドウハンドルを関数で渡す事は出来ますか?
関数で渡すとは?関数に渡す事は出来るが。
>現在ウィンドウハンドルをポインタで渡して使おうとしていますが
>ウィンドウハンドルを使用する関数を実行しようとすると
>エラーを出して終了されてしまいます
君のプログラムが悪いんだろうね。
それ以上の事は分からん。
13 :
10:2006/04/14(金) 16:40:03
言葉足らずですいませんでした。
WinMein開始後に
void GethWnd(HWND* hWnd){p_hWnd=hWnd};と言う形の関数でHWNDを渡して
int MakeMessageWindow(LPCTSTR MessageText, LPCTSTR WindowText, UINT MessageForm)
{
return(MessageBox(*p_hWnd, MessageText, WindowText, MessageForm));
};
と言う関数を実行しようとしたのですが、この関数を実行後に終了されると言う事です
ゲスウィンドウ
>>13 GethWndに渡したポインタが指す先は、MakeMessageWindowが呼ばれるまで有効なんだろうな?
つーかわざわざポインタにする意味あるのか?
C言語から出直してきやがれ、な悪寒
17 :
10:2006/04/14(金) 16:49:44
ウィンドウは一つしか使っていないのでポインタの指す先は有効だと思います
ポインタにしたのは、メッセージウィンドウを良く使うので
すべてにhWndを渡すよりは良いと思ったからです
超能力者plz
お客様の中でエスパーの方はいらっしゃいませんかーーーー?
>>17 その GethWnd() はどうやって呼んでいるの? という話。
(それ機能からするとSetHWnd()じゃないのかよ、というのは置いといて)
HWND hwnd2 = hwnd1;
とすると hwnd1 も hwnd2 も同じウィンドウを示せるというのは理解し
てないんだよね、きっと。
エラー:エスパーが見つかりません
ウィンドウハンドルもポインタも同じ大きさだから
間接参照する分ポインタの方が効率悪いんだけどね。管理も大変だし。
meinには突っ込まないのか
それgetterじゃなくてsetterだな
>>17 ウィンドウハンドル(hWnd)は、ポインタではなく値だ
だから値として保持しろ
24 :
10:2006/04/14(金) 17:10:02
すいません、脳内で
>>15をわざわざ関数〜に変換してました
ポインタは試行錯誤していた時の名残です
GethWnd()は別にヘッダを作って、そこで宣言しています
hWndを広域で宣言していたので、GethWnd()はWinMein開始直後に実行しています
hWndを使うウィンドウはそれから作っています
WinMein開始直後に渡す、そのハンドルの入った変数がautoなんだよ。すぐ壊れちゃうの。
だから皆、値で渡せと言ってくれてるの。
二度もMeinじゃマジっぽいな。
ソース全部乗っけたほうが話早そうな気がする
ほんとにまるまる全部だとアレだが
スレの初っ端から議論炸裂ですね
28 :
10:2006/04/14(金) 18:17:19
値で渡したら成功しました。ありがとう御座います
親ウィンドウを設定しているにもかかわらず、WinMain以外のヘッダで宣言した関数が
MakeMessageWindowを呼び出した時に、新しいタスクとしてメッセージウィンドウが作られました
この場合はまたhWndを渡さなくてはならないのでしょうか?
>>28 「タスク」ってなにさ…。
MakeMessageWindow()って関数を作ることで、余計理解できなくなってないか?
濃い霧に包まれているようだ。
何も見えない。
新しいウィンドウとしてタスクバーに表示されたってことじゃないか
そろそろ適切なスレに退去願おう。
33 :
10:2006/04/14(金) 18:26:53
>>28 タスクバーの中にメインとして作ったウィンドウの他に
メッセージボックスのウィンドウが作られました
WinMainの内でMakeMessageWindowを呼び出した時には作られなかったのですが
違うヘッダで宣言した関数だとウィンドウが作成されます
>>33 p_hWndがNULLだからじゃねーの?
35 :
10:2006/04/14(金) 19:31:23
C++相談室で誘導されて来ました。
質問なんですが、Windows付属のペイントソフトでブラシの太さ(堅さ?)を3段階で選べますよね?
あれをユーザが0から100の値で太さを選べるようにするにはどういうコードを書いたらいいんでしょうか?
38 :
36:2006/04/14(金) 20:26:12
>>37 ありがとうございます。
これと同じように作ってみます^^
SPY++もっていないんでSysTree++ってソフトを手に入れてインスコしたら
ウィルスを作成するプログラムが入ってたみたいで
OS再起動後、ログオン時にSysTree++を呼びにいくようなプログラムが発生して起動できない。
レジストリを前の状態に戻して再起動したらなんとかいけたけど・・・
SPY++ってC++に付属なんですよね?他にこれと同じような機能のものないですか?
他に落としたのはWinIDって奴でこれはマウス座標にあるウィンドウ内のコントロールを表示する物なんですけど
ツリー上に表示したり、ハンドル一覧のテキスト書き出しとかはできないんですよね
Winspectorも同類かな
41 :
39:2006/04/14(金) 22:33:53
PSDKに入っていなかったけ?
43 :
デフォルトの名無しさん:2006/04/15(土) 08:59:10
HFONTがわかっている場合にそのフォント名を得るにはどうすればいいのですか?
>>43 GetObject()でLOGFONTを取得。
他の実行中のプロセスに(LoadLibaryで)アタッチされているDLLのパス名を列挙するにはどうすればいいの?
DLL 列挙 API
NT系限定ならSAPI
CreateFont()にはlfFaceNameを指定する必要はないし、
フォントマッパーはlfFaceNameを無視する場合もある。
GetObject()は元となったlogfontを返す。
49 :
デフォルトの名無しさん:2006/04/15(土) 14:58:24
デバッグ料を振り込んでください
すみません、動きました。
入門書の今までの章で作ったサンプルを雛形として使いまわしていたので、
メッセージだけ受け取ってreturn 0のみ行っている部分があったのですが
これがまずかったらしいです。
DLLを自分で作ったDLLと置き換えたいのですが、
呼び出し側が下記みたいになっていたときは
DLL側の関数の宣言はどんなふうにしたらいいのでしょうか?
__declspec(dllimport) int __stdcall test();
たとえば、
__declspec(dllexport) int __stdcall test();
と言うようなふうにすると起動時に
「プロシージャエントリポイント test がDLLに見つからない」
と出てしまい、(「_test@20」と言う名称になっている)
__declspec(dllexport) int test();
と言うようなふうにするとDLLの関数を呼び出して戻ってきた時に
スタック位置が変わってると怒られてしまいます。
どこがいけないのでしょうか…
>>53 >「_test@20」と言う名称になっている
extern "C" は?
>>55 もともと C でつくってるんじゃない?
あの例だと _test@0 だけど・・・。
57 :
53:2006/04/15(土) 18:28:30
cppですが一応extern "C"はしてありました。
DEFファイルを作ってみたところ無事に実行することが出来ました!
ずっと引っかかっていたので助かりました、ありがとうございました。
>>55 extern "C"は関数名に引数や戻り値の型などの情報を含めない(マングリング抑制)
visual studioでexport関数の先頭に自動的にアンダースコアが付記されることとは別
リンクしてないという落ち。
60 :
デフォルトの名無しさん:2006/04/16(日) 02:32:16
・・・・・・・(マングリング抑制?)
横取り40万
>>61 > Buttonの上でのマウスダウン、アップを受取る
サブクラス化で。
もしくは、ボタンに見えるものを描画するだけでいいなら
DrawFrameControl
を使う方法もある。
DrawFrameControlなんかを使うとLuna対応が面倒。
ボタンといってもただの子ウインドウだからね
マウスを押しながら動かしたら移動すればいいだけだな
ヒットテストでキャプションを返せば全自動だが、
標準で機能が用意されているのに何故いちいち自分でやろうとする?
そうするとボタンとして機能しなくなるわな
RADを作りたいならそれでもよし
自分のウィンドウにWM_SIZEが来たときに自分のウィンドウをMoveWindowしたら無限ループになりますか?
70 :
61:2006/04/16(日) 15:00:49
どうしても影分身みたいにButtonが殖えます。
しかもマウスの動きにあってない!!!
どこでミスしたかわかりません。
手本になるようなサイトはないでしょうか?
てか.NETはスレ違い
72 :
デフォルトの名無しさん:2006/04/16(日) 18:19:36
単なる break; 忘れに1000ペリカ
73 :
デフォルトの名無しさん:2006/04/16(日) 18:44:21
リソースからビットマップを読みこむ方法はわかりますが、ファイルから読みこむ方法がわかりません。
そうですか。
75 :
デフォルトの名無しさん:2006/04/16(日) 18:47:36
while(TRUE){}
したらWindowsがフリーズしますか?
それともアプリケーションがフリーズしますか?
いずれもNOだ。
77 :
デフォルトの名無しさん:2006/04/16(日) 19:16:20
デュアル環境とかでない状態でスレッドの優先順位を最上位にすればOSごといける。
implementation
var
drag : boolean;
x1, y1 : integer;
{$R *.dfm}
procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
pos:TPoint;
begin
drag := true;
pos.X := Button1.Left;
pos.Y := Button1.Top;
Windows.ClientToScreen(Form1.WindowHandle,pos);
x1 := Mouse.CursorPos.X-pos.X;
y1 := Mouse.CursorPos.Y-pos.Y;
end;
procedure TForm1.Button1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
drag := false;
end;
procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if drag then
begin
Button1.Left := Mouse.CursorPos.X-Form1.Left-x1;
Button1.Top := Mouse.CursorPos.Y-Form1.Top-y1;
Button1.Caption := IntToStr(Button1.Left)+','+IntToStr(Button1.Top);
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Form1.BorderStyle := bsNone;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Form1.Close;
end;
end.
82 :
デフォルトの名無しさん:2006/04/16(日) 21:29:48
氏ね
83 :
デフォルトの名無しさん:2006/04/16(日) 23:36:17
Del厨はDelphiスレから出てくるな
それでもDelさ
なんちて
85 :
デフォルトの名無しさん:2006/04/17(月) 06:34:42
keybd_eventを使って、'_'を送る方法を教えてください。
もしくはkeybd_event以外の代案をいただけると助かります。
ちなみに、送り先はコマンドプロンプトです。
英数、マイナス、ピリオドなどはできたのですが、'_'だけが送れずに困っています。
(´ー`)ノ VK_OEM_102
>>87 できました!
'_'の場合にkeybd_eventでVK_OEM_102を送るだけでは駄目でしたが('\'が出る)、
事前にVK_SHIFTを送ることで'_'を出すことができました。
ありがとうございました。本当に助かりました。
えらくハードウェア依存な動作をしそうだが。
90 :
デフォルトの名無しさん:2006/04/17(月) 17:00:25
サブクラス化について調べていたのですが、
スーパークラス化
という単語が出てきて混乱しています
とりあえずしらべてみたところ
・オブジェクト指向とは関係ないらしい
・既存のコントロールに機能を付け足す事ができる
何がちがうんでしょうか
同じ言葉を違う意味で使ったり
同じことを違う言葉で呼んだりするから
それだけじゃなんとも
92 :
デフォルトの名無しさん:2006/04/17(月) 17:14:52
0x00001000
↑こういうのって2進数っていうんですかね?
どなたかご回答お願いします。
95 :
90:2006/04/17(月) 17:20:46
わかりました
Windowsのコントロールについて
・既存の「クラス」に機能を追加する->スーパークラス化
・既存の「インスタンス」に機能を追加する->サブクラス化
て認識でいいんですかね
>>94 たまに 0b01101001 のような 2進表記が言語レベルで欲しくなるときがある・・・
マクロで逃げてるけど
スーパークラスってサブクラスの逆の意味じゃないのか?
98 :
デフォルトの名無しさん:2006/04/17(月) 17:56:09
95のであってるよ
100 :
デフォルトの名無しさん:2006/04/17(月) 18:22:53
質問なのですがビットマップの宣言の時に
HBITMAP HaikeiBmp; という宣言と
int HaikeiBmp; というint型でビットマップの宣言をする事は
どういう意味があるのでしょうか?
どなたか教えていただけないでしょうか<(_ _)>
その宣言が同時に行なわれているなら、コンパイルエラーを出すため。
そうじゃなきゃ、後者は
・ウィンドウズのデータ型を死んでも使いたくないへそまがり。
・そもそもHBITMAPを格納する変数じゃ無い。
> ・そもそもHBITMAPを格納する変数じゃ無い。
変数名から無理矢理想像すると ImageList の index 用とかか。
宣言は同時に行われていないので、多分後者の方だと思います。
取り合えずたいして気にするような事では無かったのですね。
教えていただき、ありがとうございました<(_ _)>
OleLoadPictureについて質問です。
OleLoadPictureを使って画像を読み込んでいるのですが、
これでロードした画像の横幅と縦幅は、ピクセル単位ではないようです。
CDC::HIMETRICtoDPを使ってピクセル単位に直すようなのですが、
CDC::HIMETRICtoDPはMFCのためwindows.hをincludeしてやっている
今のプログラムと親和性がありません。
何かほかの方法で、ピクセル単位に変更することはできませんでしょうか?
OleLoadPicture関係はGoogleを使っても扱っているサイトが少なく、
扱っていてもMFCのため弱っています。
分かるかたいらっしゃいましたら、助言いただけると幸いです。
HIMETRICtoDPが中で何をやっているのか見ればいいじゃん。
MFC のソース見れば?
# DC の MapMode で分岐してるのか。
# 意外とめんどくさそうだね
その部分だけ抜き出すのは相当しんどそうですね…。
正直GIFを読み込むのにOleLoadPictureを使っているのですが、
みなさんはGIFの読み込みはどうしていらっしゃるのでしょうか。
一応ネット上でGIF読み込みルーチンが公開されていたので、それで実装してもよいのですが、
可能ならばAPIなどで済ませたいものです。
(逆にAPIですまないから、ルーチンが公開されているのかもしれないですが)
GDI+
109 :
デフォルトの名無しさん:2006/04/17(月) 20:27:39
はじめまして、よろしくお願いします。
ワードマクロから自作アプリ(C#)にSendMessageをする方法を教えて下さい。
自作マクロ側には、既に下のように書きました。
即ち、フォームインスタンスにWndProcをoverrideして
Debug.WriteLine(m.Msg.ToString());を記述しました。
これにより、フォームのタイトルバーでマウスを動かすと、
WN_MouseMoveとかがたくさん表示されるようになりました。
一方、WordVBA側に何を記載すればよいのか
なかなか検討がつきません。
今は、
ttp://www.geocities.co.jp/SiliconValley/4805/vbtips/vbtips096.htm を参考にしながら、がんばってますが、
Call SendMessage(hWndTo, WM_COPYDATA, Me.hwnd, sdtCOPYDATASTRUCT)
のMe.hwndでエラーが出てしまいます。
ワードVBA側には、何を記述すればよいのでしょうか。
このURLに記載されている通りにやっては、なぜうまくいかないのでしょうか。
お忙しい中、申し訳ないですが、宜し<お願いします…。
VBA で WM_COPYDATA というと送信元ウィンドウハンドルは 0 を指定してるのが多いな
送信元ウィンドウハンドルを NULL で って危なくない?
プロセス越しのデータ複写機構がうまく機能できるのかな?
112 :
109:2006/04/17(月) 21:07:53
サンクス!なるほど、Me.hwndは0でよかったわけですね・・・。
>hWndTo = FindWindow(vbNullString, "受信フォーム")
これの"受信フォーム"という記載を、自作アプリのフォームの
タイトルバーに設定した文字列に置き換えれば・・・いいのですね!?
ShowCursor でマウスカーソルの表示/非表示を
設定できますが、全てのアプリ(デスクトップ上)の
カーソルを表示/非表示した場合はどうすれば
良いのでしょうか?
某ねこまんまのように実行中のプロセスの
仮想メモリの中身が見たいのですが、どこから手をつければいいか
あまりにも分かりません。Win32APIの力で何とかならないでしょうか?
特定のアドレスの値を監視したいのです。
ReadProcessMemory
>>115 ああっありがとうございます!
ちょっと避け気味だったAPIですが、実はすごいですね。
それほどでもない
>>113 >カーソルを表示/非表示した場合はどうすれば
>良いのでしょうか?
別に何もしなくていいのでは? 或いは好きなことをすればいいのでは?
何のためにカーソルを表示/非表示したのか知りませんが。
119 :
デフォルトの名無しさん:2006/04/18(火) 15:53:07
サブクラス化について質問です。
fnSubProc = (WNDPROC)SetWindowLong(hWnd,GWL_WNDPROC,(LONG)SubProc)
としたらfnSubProcには元のウィンドウプロシージャが入りますよね。
そのとき、Button1とButton2とEdit1で上の式、
fnSubProc = (WNDPROC)SetWindowLong(hWnd,GWL_WNDPROC,(LONG)SubProc)
をしたとき、fnSubProcに入る値はButton1とButton2が同じでした・・・
ということはもしかしてなんですが
fnSubProcに入る値は基本的にクラスによって決まるということなのでしょうか?
120 :
デフォルトの名無しさん:2006/04/18(火) 15:59:35
どうやってハッキングするんですか?
>ウイルス、ハッキング・クラッキングを求めるような発言は禁止です。
ウィンドウのフォーカスを失わないようにする事ってできますか?
>>124 May the Focus be with you.
126 :
119:2006/04/18(火) 21:12:42
>>122 どうゆうことですか
あとsageすんの忘れてました
同じクラスのウィンドウは、同じウィンドウプロシージャを使う。
>>124 古いOSならSetSysModalWindowが効くかも知れない。
今同じようなことをやるならSetCaptureとLockSetForegroundWindowかなぁ。
システムホットキーって止められたっけ?
129 :
126:2006/04/18(火) 23:37:20
>>127 別のクラスのウィンドウに、同じプロシージャを使う方法ってありますか?
もちろん「プロシージャの内容は共通して使えるものに限る」としてです。
サブクラス化だろ
> プロシージャの内容は共通して使えるものに限る
その前提が成り立つことがほぼありえない。
132 :
129:2006/04/18(火) 23:46:35
そうです、サブクラス化の質問です。
たとえば、BUTTONとEDITを共通のサブプロシージャを使うということです。
サブプロシージャのreturn CallWindowProc()のところさえいじくれば出来そうな気がするんですけど・・・
133 :
129:2006/04/18(火) 23:48:07
がんばれば何とかなるよ。
君には無理だけど。
135 :
129:2006/04/18(火) 23:55:43
>>134 すいません。
確かにこんなことしても勉強にもなりませんよね。。。
ちょっとサブプロシージャ複数作るのめんどくさいなぁって考えちゃいました
例えば OS の Timezone が JST の環境で、EST での時刻を取得するためには
どうしたら良いのでしょうか。TIME_ZONE_INFORMATION のメンバを自分で
設定しなければならないんでしょうか。。調べたのですが良い方法が見つかり
ませんでした。
標準時差と夏時間の有無から自分で計算
cdeclでExportされた関数を
VC++で動的に呼び出す方法はあるますか?
ある
140 :
デフォルトの名無しさん:2006/04/19(水) 16:47:14
EXSTYLE = NULL
STYLE = WS_SYSMENU
の時のウィンドウのボーダーって
#define BorderWidth (GetSystemMetrics( SM_CXFIXEDFRAME ) * 2)
#define BorderHeight ((GetSystemMetrics( SM_CYFIXEDFRAME ) * 2) + GetSystemMetrics( SM_CYCAPTION ))
これで十分なんでしょうか
141 :
140:2006/04/19(水) 16:48:38
修正です、すみません
EXSTYLE = NULL
STYLE = WS_SYSMENU
の時のウィンドウのボーダー幅を求めるのは
#define BorderWidth (GetSystemMetrics( SM_CXFIXEDFRAME ) * 2)
#define BorderHeight ((GetSystemMetrics( SM_CYFIXEDFRAME ) * 2) + GetSystemMetrics( SM_CYCAPTION ))
// 640 + BorderWidth
// 480 + BorderHeight
これで十分なんでしょうか
142 :
デフォルトの名無しさん:2006/04/19(水) 16:51:59
bool flgDrnWndProc = false;
protected override void WndProc(ref Message m)
{
if (!flgDrnWndProc)
{
flgDrnWndProc = true;
const int WM_COMMAND = 0x0111;
switch (m.Msg)
{
case WM_COMMAND:
switch (m.WParam.ToInt32())
{
case 1:
search_unit();
break;
case 2:
search_end();
break;
case 3:
search_reverse();
break;
case 4:
add_unit();
break;
default:
break;
143 :
142:2006/04/19(水) 16:53:57
}
break;
default:
break;
}
}
base.WndProc(ref m);
flgDrnWndProc = false;
}
WndProc内で呼び出したメソッドの処理が終わるまで、
WndProc内の他の処理(base.WndProc(ref m);を除く。)が絶対に処理されないように、
上記のように書いてみたのですが、例えばsearch_unit();が処理されている途中でも、
case1に対応するメッセージが飛んでくると、重ねてsearch_unit();が実行されてしまいます。
なぜでしょうか・・・(低レメルな質問ですみません・・・)
144 :
デフォルトの名無しさん:2006/04/19(水) 17:24:15
DirectX SDK 7 ってもしかしてもう入手不可?
不可ならDirect3DとかいいからDirectDrawを復活させて欲しいなぁ
>>141 心配なら AdjustWindowRect で確認
>>139 単にキャストすればよかったんですね。
ありがとうございました。
147 :
141:2006/04/19(水) 17:44:05
>>145 そんな便利なものがあったのかorz
サンクス
>>143 ifブロックの中に最後の1行を入れてないからじゃないか?
それだと、trueになってから最初にWinProcが呼ばれたときにはifブロック内は実行されないけど、
必ずfalseに設定されて、次に呼ばれたときにifブロック内を実行してしまうよ。
WinProc → WndProc
スマソ
AdjustWindowRectも完璧じゃないけどな
151 :
129:2006/04/19(水) 19:23:03
BUTTON1をマウスで移動できるようにするため、
BUTTON1のサブプロシージャを、
case WM_LBUTTONDOWN:
SendMessage(hWnd, WM_SYSCOMMAND, SC_MOVE+2, 0);
break;
としました。
そしたら一応動くことには動くのですが、
それをした後にBUTTON2を押したのですが反応がありませんでした。
ですのでもう一度おしたら反応しました。
ずっとこの調子です。
これはなにが原因なんでしょうか?
あと、WM_LBUTTONUPに何かをつけるべきなのでしょうか?
処理がまったく駄目だから
153 :
デフォルトの名無しさん:2006/04/19(水) 19:30:46
>>141 WS_CHILD をON/OFFすれば出来ることは出来ると思う(藁
154 :
151:2006/04/19(水) 19:42:08
なにが駄目かわかりませんけど
書き忘れがありました。
case WM_LBUTTONDOWN:
ReleaseCapture();
SendMessage(hWnd, WM_SYSCOMMAND, SC_MOVE+2, 0);
break;
155 :
141:2006/04/19(水) 21:01:44
156 :
142:2006/04/19(水) 22:24:09
157 :
デフォルトの名無しさん:2006/04/19(水) 22:28:15
現在、あるゲームプログラミングをしています。
最後にBitBltで裏画面から表(ウィンドウ)に画像を転送しているのですが、
なんとなく非効率的だと思い、DirectXを彷彿とさせる擬似フリップ機能を作ろうとしています。
ですが、何度やっても表に出てきません。
理由または原因、出来れば解決方法を教授してください。
// 非効率的?
BitBlt( hdc, 0, 0, 320, 240, hdcFlip, 0, 0, SRCCOPY );
// 擬似フリップ
hbmpFlipTmp = (HBITMAP)SelectObject( hdcFlip, hdc );
SelectObject( hdc, hbmpFlipTmp );
158 :
デフォルトの名無しさん:2006/04/19(水) 22:33:04
メモリDCじゃないものに・・・
原因というか、そもそもそんなことは出来ない。
160 :
デフォルトの名無しさん:2006/04/19(水) 22:39:35
>>158 >>159 即レスありがとうございます。
無理なんですか。
ちょっと希望を抱いていたのですが。
メモリDCじゃないとSelectObject出来ないんですか。
初めて知りました。
BitBltで頑張ります。
ありがとうございました。
あと、SelectObjectの第二引数にhdcもありえねー
>>157 なんとなく非効率的だから改善しようという心がけが非効率的。
非効率で困るのなら、きちんとどこが非効率だか調べて、そこを重点的に効率化しなさい。
教えてえらい人!
Windows のサービスで回復タブに指定した内容で
動作させるにはどんなプログラミングを行えばいいの?
回復タブの設定ってどんな仕組みで動作するの?
>>163 CreateServiceの引数で指定できない?
そういや2D専用なDirect3Dのライブラリってないのかねぇ‥‥
>165
2D描画程度なら変換済み頂点使えばすぐだしスプライトもある
その程度の事にライブラリ求める程度の脳しかないならプログラミングなんか止めちまえ
D3DX の Sprite でほとんどの用途には事足りる気がする
あ〜やめだやめだ
漏れの脳をD3DXの為に浪費するのは勿体無いから
2D用に特化されたライブラリがあって使い勝手が悪くないなら使わなくもない。
#つーか、全ての部下が漏れ並みの脳を持っているわけではないしね。
○ 漏れ並みの脳しか持っていないわけじゃないしね
171 :
169:2006/04/20(木) 14:09:18
>>170 それなら部下にライブラリを作らせるだけ。
○ 部下にライブラリ作成をお願いして馬鹿にされるだけ
脳内部下乙
174 :
デフォルトの名無しさん:2006/04/20(木) 15:49:34
非コンソールなアプリをDOS窓から起動したときに、
そのDOS窓に、文字列を書き出したいので、
AttachConsole()
WriteConsole()
などを使う方法で出力することはできたのですが、
書き終わった後に、DOS窓のコマンドプロンプトが表示されません。
手でENTERキーを押すと、無事にコマンドプロンプトが出るのですが、
WriteConsole()で書き終わった後に、自動的にコマンドプロンプト
を出す方法がありましたら教えて下さい。
キー入力をシミュレートするしかないんでない?
176 :
デフォルトの名無しさん:2006/04/20(木) 15:54:31
>>174 アタッチがあるなら、デアタッチがありそうな気がするのはオレだけか?
と言うか、まずはググってみたらどうだ?
お前だけじゃないにしても、極端に少ないのは確か。
デアタッチ の検索結果 約 17 件中 1 - 8 件目
「デアタッチ」つったらdare touchだよなぁ・・・
"dare touch" の検索結果 約 151,000 件中 1 - 10 件目 (0.31 秒)
180 :
176:2006/04/20(木) 16:11:37
デタッチと言うのか…orz
# 英語力が無いから困る…orz
attach⇔detachなんて常識だろ
英語云々以前に、そのままカタカナ語として使われてるだろ
>>176はデバッガ触ったことすら無いのか?
今夜アナタにデアタッチ
感じる時代ラブタッチ
いいじゃんか そうじゃんか
うひょうひょ〜
クライマ〜ックス♪
おっさんw
メモリの確保について質問です
物理メモリが2G乗っているWindowsXP Proで
タスクマネージャーの利用可能メモリが1.5Gとあるにもかかわらず
HeapAllocやGlobalAllocでは
合計1.2G分のメモリを確保できませんでした
大容量のメモリを使うときの作法がなにかあるんでしたら教えてください。
よろしくお願いします。
VirtualAlloc()
VirtualAllocEx()
>>185 32bit Windowsで1.2Gもの連続領域が確保できるだけで十分幸せだと思いねえ
あ、「合計」か。まあでも、そんなもんだろ。
(゚ν゚)ニホンゴムズカスィネー
>>185 Win32アプリケーションのメモリ空間は4GB。
デフォルトではその内2GBがシステムで予約されてて、ユーザーアプリが使えるのが2GB。
一度に確保しようとすると、断片化等を考えるとそれくらいが妥当な線ではないかな?
「合計」1.2GB が微妙。
600MB のブロックが2個かも試練し、1MB のメモリブロック 1200 コかも試練。
巨大ブロックなら断片化かも試練が、HeapAlloc で数千個のブロックを alloc
してたりするなら、0.3GB分くらい消費してるかも試練。
paging境界のpaddingも気になる。
達人のみなさま、ねっとげーむ無料でやる方法教えてください!
基本料金無料のネットゲームをやる
>>194 通信料も無料でと言ってるんではなかろうか
>>187 >>191-192 500MB程度のブロックを2つと100MB程度のブロックを2つです。
VirtualAllocも試してみましたがだめでした。
・ネカフェでやる
利用料も無料にしたいなら
・他人の家でやる
他人の家に侵入するのはリスクが高すぎる
GMになればタダで遊べる上に給料までもらえる。
脳内妄想ネットゲーム。これ最強。
これで数時間、余裕で潰せる俺に、窓際なんて怖くない。
>>196 そのメモリ確保前に、どれくらい「自アプリで」メモリ使っている?
>>200 タスクマネージャーのPF使用量は
起動前221MB 起動直後224MB メモリ確保直前225MB
となっていますので
5MB前後だと思われます。
なんでプロセスタブでターゲットプロセスのメモリ使用量を見ないんだろ。
203 :
200:2006/04/21(金) 16:14:53
>>201 202の指摘ももっともだけど、5M10M程度じゃ、あまり関係なさそうだ。失礼
メモリ使用量じゃなくて仮想メモリサイズの方を見たほうがいいよ
すみません。初歩的なことかもしれませんが教えてください。
ウィンドウの左端に「あるもの」にカーソルを合わせたら出てくるメニューってどう作るのですか?
「あるもの」とはVisualstudio.Netとかの「ツールボックス」とかのあれです。
わからなかったらすみません
206 :
デフォルトの名無しさん:2006/04/21(金) 23:41:29
マウスポインタが「あるもの」の上に乗ったときにメニューを表示しすればいいんじゃないか?
教えてもらってなんですけど、
さっぱりわかりません。
確かに自分がいったものに間違いなさそうですが・・・
ですので左側に固定のものにしようと思います。
教えてくれてありがとうございます。
209 :
デフォルトの名無しさん:2006/04/22(土) 07:52:30
Windowsプログラミング初心者です。
SetWindowsHookExでWH_KEYBOARDを監視するとして、何かキーが押されたらコールバックが発生しますが
コールバック元を特定するにはどうしたら良いのでしょうか?
フォーカスの当たっているウィンドウ?コントローラ?を探す感じでしょうか?
210 :
209:2006/04/22(土) 07:59:19
書き忘れました。
↑のはグローバルフックの場合です。
211 :
デフォルトの名無しさん:2006/04/22(土) 11:25:27
IMEについての質問なんだが、
変換候補を取得する時、CANDIDATELIST 構造体を使うわけだが
CANDIDATELIST 構造体の定義
----------
typedef struct tagCANDIDATELIST {
DWORD dwSize;
DWORD dwStyle;
DWORD dwCount;
DWORD dwSelection;
DWORD dwPageStart;
DWORD dwPageSize;
DWORD dwOffset[1]; ←配列の要素は一つ
} CANDIDATELIST, *PCANDIDATELIST;
----------
dwOffset[] はこの構造体の先頭からのオフセット値で、
一つ目の文字列を取得するには 先頭アドレス+dwOffset[0] を参照する。
二つ目なら 先頭アドレス+dwOffset[1] を参照してくらしいけど、
dwOffset[]って、構造体の中の宣言ではdwOffset[1]として、要素は一つしか
宣言してないのに、サンプルプログラムとか見ると、普通にdwOffset[2]とかを
使ってる。どうして、配列違反にならないの?
その分、余分に領域を確保しているんじゃね?
newとかで。
ならないようにメモリ確保して使ってるから。
>>212-214 お、すばやい回答サンクス。
ちょっと簡単な実験プログラム書いて実験してみて理解できた。
こんなやり方があるんですね。勉強になったよ。
216 :
デフォルトの名無しさん:2006/04/22(土) 12:25:53
EnumWindowで列挙したウィンドウハンドルから
Alt+PrintScreenでクリップボードに取れるような
ウィンドウイメージを取得するのはどうすればいいでしょうか?
ウインドウハンドルがとれているのに、
何故その質問になるのかさっぱり意味が分からない。
ウィンドウハンドルからどうやってビットマップイメージに変換するんでしょうか。
(BMP)hWnd
>>219 よくわからないので、できればそのことを確認できるキーワードか解説しているURLを教えてください。
おしえてあげないよ!ジャン♪
Win32の先輩方って、構造化例外処理をどの程度活用されていますか?
例えば、HeapAlloc() に HEAP_GENERATE_EXCEPTIONS を指定したりします?
確かに便利だとは思うのですが、大きな罠が隠れているような気もします。
フォーカス当たっている領域に動的にドロップダウンリスト貼り付けてるだけ。
あっ、違います。
リストではなくその後ろの属性の値を入力できるもの全体です。
写真、ややこしいですねm(._.)m
>>223 とりあえずalloca使うときはSEH使う。
>>226 場所に応じて必用なコントロールを貼り付けてりだけ。
見たまんまだから別に悩むところでも疑問に思うところでもない。
タブ型コンボボックス内蔵リストビューがあるかと言ったらそんなものはない
C#にはあるけどね
>>223 >Win32の先輩方
Win3.1とか?
最近は言語にコントロールが付いてくるのか。
234 :
223:2006/04/22(土) 17:49:07
>>227 なるほど。ご意見どうもありがとうございます。
>>231 Win32プログラミング歴の長い皆様…という意味っす。
235 :
デフォルトの名無しさん:2006/04/22(土) 21:42:25
現在のキャレットの位置をスクリーン座標で取得したいのですが、
GetCaretPos はキャレットを所有しているウィンドウのクライアント座標しか
返してくれません。キャレットを所有しているウィンドウのハンドルが
分かれば、ClientToScreen でスクリーン座標に変換できるのですが、
そのような関数が見当たりません。どなたか助けてください!
GetGUIThreadInfo
GetForegroundWindow?
238 :
デフォルトの名無しさん:2006/04/23(日) 00:12:55
SetWindowsHookExでグローバルフックをして
WH_KEYBOARDを監視するとして、何かキーが押されたらコールバックが発生しますが
コールバック元を特定するにはどうしたら良いのでしょうか?
フォーカスの当たっているウィンドウ?コントロール?を探す感じでしょうか?
元はキーボードドライバ、とかじゃなくて?
240 :
238:2006/04/23(日) 01:45:48
説明足らずですみません。
元は、キーが押された時にフォーカスの当たっていたコントロールということです。
241 :
デフォルトの名無しさん:2006/04/23(日) 01:57:52
209 :デフォルトの名無しさん :2006/04/22(土) 07:52:30
Windowsプログラミング初心者です。
SetWindowsHookExでWH_KEYBOARDを監視するとして、何かキーが押されたらコールバックが発生しますが
コールバック元を特定するにはどうしたら良いのでしょうか?
フォーカスの当たっているウィンドウ?コントローラ?を探す感じでしょうか?
243 :
238:2006/04/23(日) 02:17:47
>>242 この場合、thread idはどこから取得すれば良いのでしょうか?
244 :
238:2006/04/23(日) 02:27:36
GetForegroundWindow
↓
GetWindowThreadProcessId
↓
GetGUIThreadInfo
をやって解決しそうです。お騒がせしました。
もしなんかもっとスマートなやり方があったら教えてください。
スレッド間で少し長め(WPARAMとかに無理やりキャストできないサイズ)の文字列を
やりとりするには、領域を確保してそのポインタを渡すような実装しかできないんでしょうか?
どっちかのスレッドがこけて解放できなくなるなんてことが普通に起きそうで怖いんですが…
246 :
245:2006/04/23(日) 05:35:18
自己解決しました。
してませんが…
>どっちかのスレッドがこけて解放できなくなるなんてことが普通に起きそうで怖いんですが
んなコード書くほうが悪いだろう。
>>245 スレッドの強制終了はNG。
フラグ立ててきっちり終了処理してから死んでくれと頼むのが基本。
その上でそのスレッドが文字列の開放を出来ない理由があるなら
開放の責任をメインスレッドに委ねてしまえばいい。
なんにしても
>領域を確保してそのポインタを渡すような実装しかできないんでしょうか?
これ以外の実装はない。
GetFocus()
他のアプリから文字を取ってきたりするけど
プロセス間のデータ受け渡しで悩むならわかるが
スレッド間で悩む必要なんてなかろうに。
動的に確保したメモリを指すポインタを渡した時にどっちに解放責任を持たすかで悩むとか
IInterfaceみたいに参照カウンタでもつけたらどうだ?
エスパーズが暴走しております
MDIでツールバーを作成する方法を教えてください!!!
自分のなかのSDIの知識だけでしたらおかしくなったのでお願いします。
257 :
デフォルトの名無しさん:2006/04/23(日) 19:42:00
MDI ツールバー
>>257 参考になりそうなサイトを教えてください(^人^)
259 :
デフォルトの名無しさん:2006/04/23(日) 19:54:53
( ̄Д ̄;) ガーン
261 :
デフォルトの名無しさん:2006/04/23(日) 19:57:39
(^人^)
Give Me Toolbar!!!
263 :
デフォルトの名無しさん:2006/04/23(日) 20:42:57
264 :
デフォルトの名無しさん:2006/04/23(日) 20:57:40
コンソールプログラムを呼び出し、その標準出力をウィンドウが受け取ったりするにはどうすればいいの?
266 :
デフォルトの名無しさん:2006/04/23(日) 21:08:09
>>196 CreateFile関数でファイル作成し、
SetFilePointer関数でlDistanceToMoveを0x7FFFFFFF,
dwMoveMethodをFILE_BEGINで実行。
んで、SetEndOfFile関数を使ったら、
連続した領域は確保できそうな気がする。
ただ、CloseHandle関数を実行する前に、
もう一度、SetFilePointer関数とSetEndOfFile関数を使わんと時間がかかるかも。
試してないけどね。
267 :
デフォルトの名無しさん:2006/04/23(日) 21:10:16
IEのメニューバーのようなツールバーを作ろうとしています。
TrackPopupMenuでメニューを表示しているとき新たに別のサブメニューを表示しなおす場合、
今までのTrackPopupMenu内の処理から抜けなければならないのですがどうするといいでしょうか。
269 :
デフォルトの名無しさん:2006/04/23(日) 22:30:58
MDIでのツールバーはクライアントウィンドウにかくのでしょうか?
272 :
268:2006/04/24(月) 00:47:51
>>270 どのようにして抜けたらいいのか分からないのです。。。
TrackPopupMenuがプログラム側に制御を戻す条件ということです。
273 :
268:2006/04/24(月) 01:22:06
WM_CANCELMODEを送ったら解決しました。すみません。
274 :
271:2006/04/24(月) 02:03:03
どうしてもわかりません。
フレームウィンドウにツールバーを作っても、クライアントウィンドウが上に来て押せなくなります。
だからといってクライアントウィンドウに書いてもウィンドウプロシージャがないために処理が出来ない。
こういった場合はサブクラス化でしょうか?
ツールバーの高さを考慮した上でクライアントウィンドウのサイズを調整すべし
276 :
271:2006/04/24(月) 02:23:45
>>275 ということはフレームウィンドウにツールバーを置いてということですよね?
一回試したのですが駄目でした。。。
やり方が間違っているのでしょうか?
case WM_SIZE:
MoveWindow(hClient, 0, 100, LOWORD(lp),HIWORD(lp),TRUE);
SendMessage(hTool, WM_SIZE, wp, lp);
break;
case WM_SIZE:
SendMessage(hTool, WM_SIZE, wp, lp);
RECT Rect;
GetClientRect(hTool,&Rect);
MoveWindow(hClient, 0,Rect.bottom,LOWORD(lp),HIWORD(lp)-Rect.bottom,TRUE);
break;
Cはよく分からないんだがこれだとどうなる?
FAQだからぐぐったらすぐ見つかると思うよ
ISAPIフィルタからASPのアプリケーション変数に
アクセスする方法があったら教えてください。
シリアル通信をするのにCreateFileでポートを開け、DCB構造体を
GetCommStateで取得してパラメータを設定、SetCommStateで設定、
という手順で初期化してるんだけど、ボーレートを230400にしよう
とするとうまくいかない。
DCB構造体を使用している限り出来ない、ということは何となく理解
したけど、じゃあどうすればいいの?
>>280 まずPCのシリアルポートがその転送速度サポートしてるのか?
普通は115kbpsあたりまでしかサポートしてないと思うが‥‥
282 :
デフォルトの名無しさん:2006/04/24(月) 12:18:20
>>280 GetCommPropertiesで取れなきゃダメなんじゃね?
イヤです。
284 :
280:2006/04/24(月) 13:27:46
即レスありがとう
>>281 デバイスマネージャから確認したところ、115200,230400,460800,921600を
ドライバ的にはサポートしているっぽい。
>>282 早速GetCommPropertiesを確認してみたところ、
commprop.dwSettableBaudの値は268435456でした。
わからん。。。
>>284 見るべきは、dwMaxBaudの方じゃないか?
>>284 あと、268435456 = 0x10000000 = BAUD_USERな
287 :
280:2006/04/24(月) 13:54:57
>>285 失礼。まちがえてた。dwMaxBaudが268435456。
ちなみにdwSettableBaudは268856176でした。
>>286 なるほど。
つまりこの値ではサポートしているボーレートの上限はわからないのね。
288 :
276:2006/04/24(月) 14:04:56
>>277 試してみました
けど、やっぱり結果は同じです。
ツールバーのボタンが見えているのに押せない(..、)
>>287 dwSettableBaudはBAUD_なんちゃらのorが入っている。
つまり、268856176だとBAUD_USERが設定可能でBAUD_57600、BAUD_115200...が設定可能と読む。
逆に例えばBAUD_128K、BAUD_56Kが設定できないとわかる。
まぁ、BAUD_USERでの上限はどうやっても判らん訳で。
290 :
デフォルトの名無しさん:2006/04/24(月) 15:35:37
もすかすて、ATコマンドでボーレート設定とか?
そりゃModem側の設定だろ
293 :
288:2006/04/24(月) 18:18:06
>>292 どうしても早くやり方が知りたいので・・・
すみません
294 :
デフォルトの名無しさん:2006/04/24(月) 18:25:33
>>293 The Code Projectが一番勉強になる件
レバーコントロールのバンドのタイトルを「(&D)」などとしても下線がつかなかったのですが
どうするとつけることができますか?
誰かNetMeetingのAPIを使って
簡単なサンプルを書いてくれ。
297 :
288:2006/04/25(火) 01:28:16
>>277さん、原因がわかりました。
WM_SIZEの処理をしたあとにbreakをしていたのがまずかったです。
つまりその処理の後にデフォルトプロシージャの処理をしてしまっていました。
return 0;に直したら動きました。
299 :
デフォルトの名無しさん:2006/04/25(火) 10:48:00
WriteFileExの成功の判断の方法で質問があります。
MSDN
http://www.microsoft.com/JAPAN/developer/library/jpwinpf/_win32_writefileex.htm に
=======
関数が成功すると、0 以外の値が返ります。
=======
WriteFileEx 関数を使う場合、この関数が「成功」を示す値を返していても、それだけでは不十分です。GetLastError 関数を呼び出して、いくつかの条件が「成功」しているだけで、把握するべき他の条件がエラーになっていないかどうかをチェックしてください。=======
とあります。
ここでCreateFile,WriteFileEx,CloseHandleの一連の操作を行うテスト・プログラムにおいて,WriteFileExの戻り値が1になっています。処理は正しく行われています。
しかし,MSDNに関数が成功(0以外の値)のときだけでは不十分との記述があったので念のためGetLastErrorを呼び出すと値が6(ERROR_INVALID_HANDLE)でした。Closeが正常なのでハンドルが無効とは考えにくいです。
とすると関数が1(成功)返し,GetLastErrorがERROR_SUCESSを返さない場合はどう判断すればいいのでしょうか?
300 :
デフォルトの名無しさん:2006/04/25(火) 12:25:38
>>299 GetLastError()は最後に発生したエラーのコードを返す。
6(ERROR_INVALID_HANDLE)のコードが、
WriteFileEx()の呼び出しで設定されたかどうかを判断すべき。
>>299 GetLastError が ERROR_SUCCESS を返すこと確認するのではなく、
関数が 1 を返すが、アプリ側でさらに処理が必要なケース
(例えば ERROR_MORE_DATA ) について必要な処理を行うようにしてください。
関数が 1 を返し、GetLastError が ERROR_SUCCESS を返すのは、
書き込みが(なぜか)同期的に完了し、コンプリーションルーチンは呼ばれない
ということを示しています(これは0バイトの書き込み以外では珍しいケースです)。
これは成功というより例外的な結果で、アプリが期待しているようにコンプリーション
ルーチンが呼ばれないため、何か特別な対応をする必要が(たぶん)あるでしょう。
(自分で呼ぶとか)。
・・・「例えば」とありますが、ERROR_MORE_DATAとERROR_SUCCESSの2つ以外の
どんな値に対応する必要があるのかは謎です。たぶんこの2つだけでOKなのでしょう。
302 :
デフォルトの名無しさん:2006/04/25(火) 12:42:43
>>299 WriteFileExって非同期で書き込みオーダーを出してるだけなんじゃね?
OVERLAPPEDがあるから、FDなど遅い媒体への書き込みとか試してみた?
>>299 まずは、(Exのついていない)WriteFile()を使って非同期書き込みを行うプログラムを書いて見ることを強く勧める。
そうすれば、「WriteFileEx 関数を使う場合、この関数が「成功」を示す値を返していても、それだけでは不十分です。」
の意味が理解できると思う。
>>300のコメントにあるようにWriteFileExが非0を返したあとにGetLastErrorを呼んでも無意味。
GetOverlappedResultが0を返したとき、GetLastErrorを使う。
横から
>>301に補足
>関数が 1 を返すが〜
戻り値の型がBOOLやbool値の関数の成否を確認する際は
TRUE/trueとの比較はせず、FALSE/falseと比較にしませう
誘導されてきました。質問です。
エクスプローラみたいなものを作っていて、縮小版表示アイコンを表示させたいです。
画像のサムネイル表示は出来ましたが、画像以外ファイルのアイコンで
エクスプローラで表示されているような
黒枠の中に小さいアイコンがぽつんとあるアイコンが取れません。
32*32のアイコンを引き伸ばして表示することは現在可能です。
IExtractImage, IExtractIcon, SHGetFileInfoなどつかいましたが同じ状況です。
開発環境はWin2000, VC++6.0です。
また、IExtractImageで取得・表示しているサムネイル画像ですが、
Win2000だと表示できるのに、WinXPだと表示できない画像がまれにあります。
IExtractImageで取得したBitmapをImageListに追加するときに
エラーが起こっているようです。XPでコンパイルしてもダメでした。
このような現象になったことがあるかたいらっしゃいませんか?
306 :
デフォルトの名無しさん:2006/04/25(火) 14:26:37
激しくスレ違いで、大変申し訳ないでつが、
GIF8ビット深さのファイルの(PixelFormat.Format8bppIndexed)
各ピクセルの色を表現するには、0〜255の数字によりますよね。
0が黒で、
1が__色で、
2が__色で、
・
・
・
GIF256色の一覧表って、どのサイトに掲載されているか
教えていただけませんか?かなり困ってます・・・くぅ〜
(探したのですが、僕の探し能力ではみつかりませんでした)
ファイルの中にカラーテーブル持ってる
308 :
306:2006/04/25(火) 14:30:56
>>307 いま、307がものすごくいいこといった!!
そこをもっと詳しく・・・(・д・)
なんか .NET っぽいな。
Image に Palette プロパティがあるだろ。
310 :
306:2006/04/25(火) 14:34:50
>>309
どうして.Netだとすぐばれる・・・○rz
Bitmap bitmap1=new Bitmap(fs);
fs.close();
bitmap1.Palette・・・ほんとだ、それらしいのありました。
ってことは、ビットマップインスタンスを
ロックビットして、unsafeでバイト配列を観察していく
方法はだめだったのか・・・くぅ
つーか、0が黒とは限らないしそもそもAPIに関係ないだろ。
312 :
306:2006/04/25(火) 14:36:44
>>311 >>つーか、0が黒とは限らないし
いま、311がものすごくいいこといった!!!
>>311
>>そもそもry
306 :デフォルトの名無しさん :2006/04/25(火) 14:26:37
激しくスレ違いで、大変申し訳ないでつが、
313 :
306:2006/04/25(火) 14:40:21
ってことはbitmapインスタンスをLockBitsして
1バイトごと順番に観察していくだけでは、
画像の中に赤いピクセルがあるかないか、それすらわからないのですか!!
くはっ今までの苦労はなんだったのか・・・
314 :
306:2006/04/25(火) 14:53:48
いい加減黙れスレ違い野郎うぜぇ
316 :
306:2006/04/25(火) 15:09:57
byte byWhite=255;
byte byBlack=255;
for (int i = 0; i < 256; i++)
{
//白を見つけたら、
if (bitmap1.Palette.Entries[i].R == 255 && bitmap1.Palette.Entries[i].G == 255 && bitmap1.Palette.Entries[i].B == 255)
{
byWhite = (byte)i;
break;
}
}
for (int i = 0; i < 256; i++)
{
//黒を見つけたら、
if (bitmap1.Palette.Entries[i].R == 0 && bitmap1.Palette.Entries[i].G == 0 && bitmap1.Palette.Entries[i].B == 0)
{
byBlack = (byte)i;
break;
}
}
if (byWhite == 255 || byBlack == 255)
{
return false;
}
ご迷惑おかけしました。
無事、解決することができましたことをご報告申し上げます。
皆さん、ありがとうございました。とても助かりました。
プログラム側から、ツールバーのボタンを押したというメッセージを送るにはどうしたらいいのでしょうか?
そういうメッセージをSendMessageなりPostMessageなりすればいい
319 :
デフォルトの名無しさん:2006/04/25(火) 16:30:00
ContextSwitchDeadlockって何ですか?
デバッグ中に凍ったと思ったら、こんなの表示されたよ
306によって質問が流された>305です。
どなたかわかる方がいたらお願いします。
>319
ぐぐったらなんか出てきたけどこれとは違うの?
306を頃すAPIを教えてください
322 :
デフォルトの名無しさん:2006/04/25(火) 17:10:41
299です。
>>300さん
はい。これは実験しました。で,結果ですがわすれちゃった(笑)。CreateFileの直後は0ですがWriteFileExの直後で6になっているのでWriteFileExで設定していると判断した記憶があります。
>>301さん
はい。どうもそれが正解のようです。ありがとうございました。
>>302さん
試していません。って言うか,実はWriteFileExとWriteFileの処理時間を比較していたのです。
>>303さん
WriteFileExとWriteFileの差を見ていたのですが,WriteFileで非同期の書き込みの実験はしていませんでした。意味はまだ理解できていませんが,おれ的には301さんの発言が正解のような気がしています。
GetOverlappedResult なんて関数があったんですね! WriteFileExばかり見ていたので気がつきませんでした(WriteFileExからはリンクがない)。でもWriteFileExで使えるとは書いてありません。要実験ですね。
http://www.microsoft.com/japan/developer/library/jpwinpf/_win32_getoverlappedresult.htm Win32APIって何でも実験なんだなぁ…。初心者にはきつい。
>>304さん
はい。そうですね。TUREとしては0以外と定義されているので1を返す関数と0xFFFFFFFFを返す関数があるようです。
305です。
二つ目の項目は自己解決しました。
GetLocationのフラグにあったIEIFLAG_ORIGSIZEをはずしたらOKでした。
324 :
デフォルトの名無しさん:2006/04/25(火) 18:14:59
>>322 しかし、WriteFileExで、
OVERLAPPED構造体のリンクが外してあるのはヒドイよな。
WriteFile→WriteFile(非同期)→WriteFileExの順でやらんとピンとこんかもね。
325 :
320:2006/04/25(火) 18:31:57
ぐぐたーけど、全部英語よってに・・。
326 :
320:2006/04/25(火) 19:26:30
教えて、えろい人。
327 :
319:2006/04/25(火) 19:28:02
ごめんなさい、325と326は、319でした。
>>306 どうでもいいけどパレットエントリ中に白があるからといって画像中に白がある保証はない罠。
> 親子関係がよくわからなくなると思うのですが
お前が無能だからだな
そもそもやる必要性があるんだろうか
自分では一般的な処理だと思っててもAPIが用意されてなかったりする場合
大抵その処理自体をやる必要がなかったりする
(別のアプローチで最終的にやりたい事ができるソリューションがあるということ)
>>333 ありがとうございます。
これなら出来そうです。
>>331 > お前が無能だからだな
確かに無能です。
ですのでどのようにしたらGetParentでの処理が出来たのか教えてください。
ダメです
Σ(゚д゚lll)ガーン
そんなにめんどくさがらなくてもいいじゃないですかぁ!!!
><;
338 :
デフォルトの名無しさん:2006/04/26(水) 03:37:01
リストボックスにListBox_InsertStringマクロを用いて文字列を挿入しよう
としています。しかしインデックスを毎回同じにしても、上書きされずに
下の行に追加されていきます。上書きはどうやればできるのでしょうか。
調べたらわかりそうなもんだが
340 :
デフォルトの名無しさん:2006/04/26(水) 07:54:24
数字キーを押した時など、ひとつの行動で
メッセージが2つ以上来る行動があります。
その場合、1つ目のメッセージが終わった後、
2つ目のメッセージが来るのか、
2つのメッセージが同時、又は1つ目のが終わる前に、
2つ目のが来るのでしょうか。
341 :
デフォルトの名無しさん:2006/04/26(水) 08:07:24
>>338 Insertだから意味的にはあってない?
>>340 キー離したときにもメッセージが来ない?
lKeyDataの30ビット目とか
342 :
340:2006/04/26(水) 08:13:30
ありがとうございます。
WM_KEYUPが来ると思います。
>>340 > 2つのメッセージが同時
メッセージ『キュー』ってものを勉強し直せ
344 :
340:2006/04/26(水) 09:45:54
ありがとうございます。
基本的には同時じゃないみたいですね。
ただ、SendMessageを使うと、
前のメッセージを飛び越して終了するとかもあるみたいです。
試せば解ると思うんだけどな・・脳内にしかPC無いの?
346 :
デフォルトの名無しさん:2006/04/26(水) 12:35:45
>>345
思わず、職場で、吹き出したー。
メッセージキューと
SendMessage PostMessageその他関数の挙動について調べれば
試さなくてもわかるだろ
348 :
340:2006/04/26(水) 13:34:20
脳内にも(ry。ウィンアプリのコールバックは、
ドスのに比べて、実態が掴みにくいというか。
コールバックやGetMessageのみに
来るメッセージがあったりしますし。
「猫でも・・・」で勉強しています。
猫のプログラムはVCで作成されたものみたいなのですが、VCがないのです。
ですので
Borlandで試していたら大体、リソーススクリプトのダイアログボックスで失敗します。
リソーススクリプトをどのように変更したら似たような動きになりますか?
同じフォルダにafxres.hを作ることはしました。
WS_xxx が定義されていないなら「#include <winresrc.h>」を、FONT部でエラーが出るなら
「FONT 8, "MS Shell Dlg", 400, 0, 0x1」等を「FONT 8, "MS Shell Dlg"」のようにしてみれば?
>>350さん、試しました
けど結果は特に変わりません。
==============================================
エラー内容
Borland Resource Compiler Version 5.40
Copyright (c) 1990, 1999 Inprise Corporation. All rights reserved.
Error dialog01.rc 81 25: Expecting BEGIN
==============================================
ソースの一部
MYDLG DIALOGEX 0, 0, 186, 90
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION |
WS_SYSMENU
CAPTION "オプション"
FONT 8, "MS Shell Dlg", "MS Shell Dlg" ←81行目
BEGIN
DEFPUSHBUTTON "OK",IDOK,7,69,50,14
PUSHBUTTON "CANCEL",IDCANCEL,129,69,50,14
LTEXT "ダイアログボックスです",IDC_STATIC,39,16,94,8
END
==============================================
352 :
351:2006/04/26(水) 15:56:10
すみません!!
間違えてました。
FONT 8, "MS Shell Dlg"ですね、
353 :
351:2006/04/26(水) 15:58:46
動きました。
ありがとうございますm(_ _m)
あと一つ、
「FONT 8, "MS Shell Dlg", 400, 0, 0x1」
の「400, 0, 0x1」この部分はなんなのでしょうか?
ウィンドウハンドルから、クラス名を取得する方法ってありますか?
355 :
354:2006/04/26(水) 16:26:20
クラスメイトは"BUTTON"とか"EDIT"です。
俺もそんな学生時代を過ごしたかったな。
w
358 :
355:2006/04/26(水) 17:02:57
?、・・・・・・・・!!!
間違えました!!!
ていうか誤変換です。
訂正↓
クラス名とは"BUTTON"とか"EDIT"のことです。
GetClassName
360 :
358:2006/04/26(水) 17:26:53
サンクス!!
361 :
デフォルトの名無しさん:2006/04/26(水) 17:36:08
362 :
デフォルトの名無しさん:2006/04/26(水) 21:15:52
8bitのBitmapを24bitのBitmapに変換したいのですが、
そのようなAPIは存在しますか?
メモリDC上でBitBltかませばいいんじゃない?
364 :
デフォルトの名無しさん:2006/04/26(水) 21:35:57
>>347 妹と話していたら、
『きゅぅ』と『ふぃふぉ』の発音が新鮮に聞こえた件について。
忘れてくれ。
ファイル内の特定の文字列を変換(京都を東京に変換など)するプログラムを作りたいのですが、
EDITクラスを使ったほうが簡単に出来そうなかんじがしました。
実際のところ簡単になるのか教えてください。
なりません
API とは関係ないな
変換するだけならGUIじゃなくてもよくね?
371 :
デフォルトの名無しさん:2006/04/26(水) 22:48:22
>>366 むしろ、stringクラス
typedef std::basic_string<TCHAR> _tstring;
// 文字列のsFindをsReplaceの置き換える。
inline _tstring& Replace(_tstring& sExp, const _tstring sFind, const _tstring sReplace)
{
_tstring::size_type n = 0;
_tstring::size_type nCur = 0;
// Replace処理
while ((n = sExp.find(sFind, nCur)) != _tstring::npos){
sExp.replace(n, sFind.size(), sReplace);
nCur = n + sReplace.size();
}
return sExp;
}
詳しくは、ここじゃなくSTLかも
むかし、データのソートをしたいためだけにLBS_SORTな
リストボックスにデータをぶち込むやつがいた。
373 :
366:2006/04/26(水) 22:51:02
C言語Onlyなんですよ・・・
char型配列か、mallocの領域確保しか出来ないし・・・
確認なんだが
>>366の言ってるEDITクラスってのはウィンドウクラスの事でいいんだよな?
C言語のみのくせにWinAPIは使ってよいと言うのはわけがわからない。
とにもかくにもスレ違い
377 :
デフォルトの名無しさん:2006/04/26(水) 22:58:08
>>373 ファイル?
ファイル内の?
んでC言語?
378 :
デフォルトの名無しさん:2006/04/26(水) 23:06:28
379 :
デフォルトの名無しさん:2006/04/26(水) 23:42:57
縦横の解像度が違うのプリンターに線幅1mmをピクセル単位(MM_TEXT)で指定する場合、
mm→dot変換は
1mm*(縦解像度/25.4)
それとも
1*mm(横解像度/25.4)
どちらでしょうか?
昔、それは気になったけど試してない。
手元にそういうプリンタがあるなら、試すのが一番
381 :
デフォルトの名無しさん:2006/04/26(水) 23:59:26
手元にプリンター無いんです
CreatePenする時だけマッピング変更する事って
可能なんでしょうか?
自分でやってみたけど上手く行きせんでした
382 :
デフォルトの名無しさん:2006/04/27(木) 00:25:09
あるファイルをオープンしようとした時に、他のプロセスが排他オープンしている為に
オープンに失敗したとします。
この時、ファイルを排他オープンしているプロセスの名前やプロセスIDを取得する方法は
あるんでしょうか?
ウィンドウのフォントを取得、設定する関数を教えてください。
お願いします。
385 :
デフォルトの名無しさん:2006/04/27(木) 08:17:26
そーいや、コスメティックペンとジオメトリックペンって属性違ってたね。
ジオメトリックペンは座標変換によって幅が変わったと思う。
CreatePenでnWidth=0なら、座標変換に左右されなかったような・・・
387 :
デフォルトの名無しさん:2006/04/27(木) 12:52:44
ボリュームコントロールのようなスライドバーを実装したいのですが
どのような関数、又は組み合わせで作るのでしょうか
CreateWindow
>>384 FontSizeとFontは、SendMessageでなにを送ったらいいのですか?
メッセージ
あたりまえじゃん
>>372 SH系APIが無かった頃ファイル一覧を取るためだけに不可視リストボックス作ってた俺が来ましたよ。
393 :
387:2006/04/27(木) 13:14:32
>>388 システムクラスにSCROLLBARなんてものがあったんですね・・
ありがとうございました
WM_GETFONTを見つけました。
これでしょうか?
SendMessage(hWnd,WM_GETFONT,0,0);ではNULLAが返ってきました
掲示板で質問するほどのことかな?
ぬらー
397 :
デフォルトの名無しさん:2006/04/27(木) 13:44:12
コントロールが使用しているフォントのハンドルを返します。コントロールがシステム フォントを使用している場合には、 NULLを返します
ありがとうございますぬらー
MSDN読まない奴は
400 :
デフォルトの名無しさん:2006/04/27(木) 14:28:01
おまいら、ぬらぬら、ゆってんじゃねーよ。
リソーススクリプトのダイアログ部分を自作しました。
やり方は、CreateWindowで作るWindowサイズをそのまま当てはめていくというかんじでした。
まぁ、つまり以前作っていたウィンドウと同じ形のダイアログを作ろうとしたというわけです。
そしたら思っていた形より大きくなりました(1.4倍ぐらい?)
どうしたら形が同じようになるの?
ちゃんと理解する
ダイアログユニットとかいうやつ
404 :
デフォルトの名無しさん:2006/04/27(木) 16:02:50
なんか見に行ったら画面真っ白。
ソース見たらなんかそれっぽいこと書いてる。
なにこれ?
ダイアログユニットを調べました。
フォント幅の4/1=x座標の単位
フォント幅の8/1=y座標の単位
とありました。
ですがピクセル単位でしていたものをダイアログユニットの単位に変換する方法がわかりません。
ピクセル単位/(フォント幅/4)=ダイアログユニットによる座標
かと思いましたが違いました。
フォント幅をどうにかするのでしょうか?
それとも計算式自体が間違っていますか?
すみません、本当は私パソコン自体が初心者なんです。
ですのでお願いします。
>>406 GetDialogBaseUnitsをMSDNでしらべれ
408 :
デフォルトの名無しさん:2006/04/27(木) 16:46:24
UpdateLayeredWindowについてなんですが、
以下のように実装してます。
UpdateLayeredWindow( hwnd, hdcScreen, &pos, &szWindow, hdcMemory,&ptSrc, 0, &bf, ULW_ALPHA );
hwndで指定する、ウインドウハンドルをダミーのウインドウを作って指定していますが、
自分自身のウインドウハンドル(m_hWnd)を指定する事は可能でしょうか?
実際にやってみて、正しく動作しなかったんですが、実装ミスかもしれないと思い、本当のところはどうなのかと思いまして。
如何でしょう?
>すみません、本当は私パソコン自体が初心者なんです。
>ですのでお願いします。
本当にそうなら随分と達者だな。
駄菓子菓子、それを言い訳にするくらいならプログラミングなんて止めて置け。
おまいら、にらにら、ゆってんじゃねーよ。
中華料理店の料理長か?
ヤベェ・・・なんか背筋がゾクっとした (((((((( ;゚Д゚)))))))
CreateWindowはstyleがNULLだと失敗するものですか?
412 :
デフォルトの名無しさん :2006/04/27(木) 21:03:28
教えてください。いままでリンカのエラーはなかったのですが以下の
エラーが出てしまいました
Typing.obj : error LNK2019: 未解決の外部シンボル __imp__timeGetSystemTime@8 が関数 _WndProc@16 で参照されました。
Typing.obj : error LNK2019: 未解決の外部シンボル _TypeStart が関数 _WndProc@16 で参照されました。しまいました。
VC\VCProjectDefaults\corewin_express.vspropsは
AdditionalDependencies="kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib" />と
してるのですが、どのlibが足りないもしくは不要なのでしょうか
どなたか教えてください
413 :
デフォルトの名無しさん:2006/04/27(木) 21:28:59
>>412 #include <mmsystem.h>
#pragma comment(lib, "winmm.lib")
414 :
387:2006/04/27(木) 22:04:20
何度もすいません
確かにCreateWindowのシステムクラスをSCROLLBARにするとバーは作れるのですが
Sliderコントロールのような物を作りたいのですが、SCROLLBARで色々やってみたのですが無理な感じです・・
どのような方法で作成するのでしょうか・・
CreateWindowEx
417 :
412:2006/04/27(木) 23:20:22
>>413さんありがとうございました
#include <mmsystem.h>
#pragma comment(lib, "winmm.lib")
で__imp__timeGetSystemTime@8は解消されました
ただ、まだ以下のエラーがでるのですが
Typing.obj : error LNK2019: 未解決の外部シンボル _TypeStart が関数 _WndProc@16 で参照されました。しまいました。
そもそもTypeStart(HWND)という関数は存在するのでしょうか
猫の本見ながら打ってるのですが、ソースにTypeStartを宣言は
しているんですが、そのTypeStart関数の定義がどこにもなく
また別のlibにあるのかと想像しているのですがどこにあるのかがわかりません
なんども申し訳ないですが、教えてください。お願いします。
418 :
デフォルトの名無しさん:2006/04/27(木) 23:37:05
419 :
387:2006/04/28(金) 00:11:35
>>416 参考URLを見ながらやってみたところ出来ました
ありがとうございました
>>415 CreateWindowExのコモンコントールを使うんですね
416さんのレスでやっとわかりました・・ありがとうございました
( ゚д゚)ノ 先生!拡張ボタン(X1、X2)が押された時に送られてくるメッセージを教えてください!
>>420 い・・いたい・・・
ひい・・・やめて!!それいじょうは・・・
ひぎいいいい
>>421 |д゚)・・・
( ゚д゚)ノ なるほど!先生!WM_XBUTTON〜ですね!ありがとうございます!
っつーかなんでこれググっても35件くらいしかヒットしないのかと
全然見つからんかったよ
423 :
デフォルトの名無しさん:2006/04/28(金) 01:32:07
コントロール上のフォント、たとえばEDITコントロールのフォントの変更ってどうやってやるんですか?
SendMessage
426 :
412:2006/04/28(金) 03:34:31
>>418さん
ありがとうございました
見落としてました。すんません。
チャックボックスをIsDlgButtonCheckedで確認できるけど、逆に設定する時はどうすんの?
>>427 チャック・・・
スマソ、チェックでそorz
431 :
427:2006/04/28(金) 12:44:50
ごめん、ごめんよ。そしてありがと
いきなりあれですけど、
GetClientRectってウィンドウの大きさしか返さないじゃないですか。
GetWindowRectはスクリーン座標の左上、右下ですよね。
ということは親ウィンドウの中のボタンを、
親ウィンドウを元にしたクライアント座標で求めるには
GetWindowRectをしてScreenToClientを使ったりするってことですよね?
めんどくさくないでしょうか?
それとも専用の関数があるのでしょうか?
慣れろ
ということはそういう関数がないってことですかぁ(..、)
それじゃ自分用に作っておいた方が楽ですよね?(関数名何にしょうかな)
テケトーにMSDN流し読みしただけだけど
MapWindowPointsって、使えネーかな?
やべ、ぱそこんが「カチ、カチ・・・」て鳴り出した。。。
まぁ、それはともかく使い方は
GetWindowRect(hWnd,lprect);
MapWindowPoints(GetParent(hWnd),lprect);
てなかんじじゃないのか?
エラー E2034 'tagRECT *' 型は 'HWND__ *' 型に変換できない(関数 GetParentClientRect(HWND__ *,tagRECT *) )
エラー E2342 パラメータ 'hWndTo' は HWND__ * 型として定義されているので tagRECT * は渡せない(関数 GetParentClientRect(HWND__ *,tagRECT *) )
エラー E2193 呼び出し時のパラメータが足りない:__stdcall MapWindowPoints(HWND__ *,HWND__ *,tagPOINT *,unsigned int)(関数 GetParentClientRect(HWND__ *,tagRECT *) )
すいません、よく見たらhWndではなくcWndて書いてました。
それとブルスクまでイっちゃたのでこのパソコン控えます。
みなさん、今まで本当にありがとうございました。。。
∧_∧
( ・∀・)
>>私 /⊂ つ
↓ / ,(__つ
⊂⌒~((⊃*。Д。) し'
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
∧_∧
( ・∀・)
>>1 /⊂ つ
↓ / ,(__つ
⊂⌒~((⊃*。Д。) し'
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
ゴメン、下の図はなし、消し忘れ。
それじゃさようなら
ブルスク?
ブルマとスク水か?
>>432 > GetClientRectってウィンドウの大きさしか返さないじゃないですか。
ウィンドウの大きさは返さないがな
まぁまぁ、故人をいたぶるのはよしましょうや。
それはともかくスク水の上からブルマですか。
どこがいいのかわかりません。
マニアック過ぎです。
ついていけません。
442 :
デフォルトの名無しさん:2006/04/28(金) 18:58:34
ブルースクリーン!!!11
ガタガタ .γ"⌒ヽ,
.んヘ/V'ヘ
((( 'ヘ/V'ヘ)))
ゝ、._,ノ.
パカッ .γ"⌒ヽ,
.んヘ/V'ヘ
(*‘ω‘ *) ちんぽっぽ!
( 'ヘ/V'ヘ|)
ゝ、._,ノ.
444 :
デフォルトの名無しさん:2006/04/28(金) 19:23:51
ブルスコと言えばファービーだろ。
フルアセンブラでプログラミングしているのですが、プログラムのエントリポイントの関数仕様はどうなっているのでしょうか?
DWORD __cdecl main(void); // (Cスタイル)
でいいんでしょうか?
また、この仕様を書いた文書はどこかにあるのでしょうか?
448 :
デフォルトの名無しさん:2006/04/29(土) 07:11:32
>>447 よくエントリポイントのように言われている main や WinMain はスタートアップから呼ばれるコールバックに過ぎない
スタートアップを使わない場合は link.exe の /entry でエントリポイントを定義し、 /subsystem で GUI か否かを選択する
ここapiスレだけど
450 :
デフォルトの名無しさん:2006/04/29(土) 09:26:39
どうしたって関係あるだろ
451 :
デフォルトの名無しさん:2006/04/29(土) 10:06:56
MSVC4.0の頃、プロジェクトをコンソールベースで作ったとき、
無理やり
>>448な作業をしたことを思い出した。
pathが通らない
と同じで定期的に質問がくるテーマですな
453 :
 ̄ ̄ ̄|/ ̄ ̄ ̄ ̄ ̄ ̄ :2006/04/29(土) 12:04:38
. ∧_∧
(´・ω・)
/ \
__| | | |_
||\ \ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\
||\\ \ | ( ´д)ヒソ(´д`)ヒソ(д` ) >
|| \\ \ \__________/
. \\ \
. \\ \
. \\ \ が ら 〜 ん
. \\ \
. \\ \
\| ̄ ̄ ̄ ̄ ̄ ̄ ̄ |
|| ̄ ̄ ̄ ̄ ̄ ̄ ̄||
. ∧_∧
(´・ω・)
/ \
__| | | |_
||\ \
||\\ \
|| \\ \
. \\ \
. \\ [ ゚д゚]y-一~~~~
. \\ ノ[ ヘ ヘ \
. \\ \
. \\ \
\| ̄ ̄ ̄ ̄ ̄ ̄ ̄ |
|| ̄ ̄ ̄ ̄ ̄ ̄ ̄||
タイトルバーをクリックした時にシェード(折りたたみ)をするように
書こうとしているのですがうまくいきません。
ウィンドウスタイルからWS_THICKFRAMEを外し、
MoveWindowで高さをタイトルバー以下にしても
タイトルバーの下にほんの少しクライアント領域ができてしまいます。
AdjustWindowRect関数でクライアント領域を0にしてみても駄目でした。
どのようにして実装すればよいでしょうか?助言よろしくお願いします。
>>432のいってたことが気になったので、
自作で親ウィンドウをもとにした、
クライアントウィンドウの位置を求める関数を作ってみたのですがとりあえず見てください。
BOOL GetParentClientRect(HWND hWnd,LPRECT lprect)
{
RECT ParentRect;
RECT Rect;
if(GetWindowRect(GetParent(hWnd),&ParentRect) == 0) return FALSE;
if(GetWindowRect(hWnd,&Rect) == 0) return FALSE;
lprect->left = Rect.left - ParentRect.left;
lprect->top = Rect.top - ParentRect.top;
lprect->right = lprect->left + Rect.right - Rect.left;
lprect->bottom = lprect->top + Rect.bottom - Rect.top;
return TRUE;
}
としたらタイトルバーの幅を考慮していなかったので、y座標がタイトルバーの分だけずれてしまいます。
ですのでタイトルバーがある場合、その分を減らす処理をどうするのかと考えています。
なにかあったら教えてください。
この関数が明らかに間違っている場合は「あんたバカあ!」とでも言ってください。
あんたバカあ!
!(TロT)うあーん
ほんとに言いやがったぁ(泣)
なんかカワイイ
や、やめてください!
そんないやらしい目つきで見るのはっ!
よいではないか
というよりわたし、男なんですけど・・・
463 :
456:2006/04/29(土) 16:53:03
もしかして無理なの?
BOOL GetParentClientRect(HWND hWnd,LPRECT lprect)
{
RECT rect;
POINT pos;
GetWindowRect(hWnd, &rect);
pos.x = rect.left;
pos.y = rect.top;
ScreenToClient(GetParent(hWnd), &pos);
lprect->left = pos.x;
lprect->top = pos.y;
lprect->right = pos.x + rect.right - rect.left;
lprect->bottom = pos.y + rect.bottom - rect.top;
return TRUE;
}
BOOL GetParentClientRect(HWND hWnd,LPRECT lprect)
{
POINT pos = {0};
GetWindowRect(hWnd, lprect);
ClientToScreen(GetParent(hWnd), &pos);
OffsetRect(lprect, -pos.x, -pos.y);
return TRUE;
}
466 :
デフォルトの名無しさん:2006/04/29(土) 17:46:42
削除権限のないレジストリを削除するプログラムを組みたいのですが
可能でしょうか?
削除する権限を得る
468 :
456:2006/04/29(土) 18:08:15
>>465 マジ(・∀・)ゴッド!
まさかOffsetRectなるものがあったとは。。。
>>466 LogonUserとかImpersonateLoggedOnUserとか何か
そのへんをうまく使ってがんばる
>>468 OffsetRectは本質ではないんだが
471 :
デフォルトの名無しさん:2006/04/30(日) 03:06:08
BorlandC++にて、
サイズ変更できるボタンを作るため、サブクラス化しました。
内容は、
WM_LBUTTONDOWN:
ReleaseCapture();
SendMessage(hWnd,WM_SYSCOMMAND,SC_SIZE | 7,0); //ウィンドウのサイズ(右下)が変更できる
return0;
です。
それで、サイズ変更は出来るようになりました。
それはいいのですが、なぜかサイズが一定のサイズまでしか下げれません(right=110,bottom=25)。
試しに、EDITでも同じようにサイズ変更出来るようにしました。
こちらはそういったことは起きませんでした。
この違いは何なのでしょうか?
472 :
デフォルトの名無しさん:2006/04/30(日) 03:55:32
はじめまして
こんな感じでグローバルフックの対象を切り替えたいのですが
うまくいきません なんで?
もちろんDLL内で行って 初めの一回は成功します
ちょっと 困ってます・・(この時間 まだ終わらん・・・)
UnhookWindowsHookEx(hSysHook);
DWORD dwThreadId = GetWindowThreadProcessId(hwnd, NULL);
hSysHook = SetWindowsHookEx(WH_CALLWNDPROC,(HOOKPROC)SysCallWndProc, hDllInst, dwThreadId);
473 :
デフォルトの名無しさん:2006/04/30(日) 04:33:07
WindowsXPでユーザーの簡易切り替えをするとします。
Aユーザが実行中のアプリのウィンドウに対してBユーザのアプリから、
たとえばハンドルを取得してPostMessageを投げるとか可能でしょうか?
FindWindowできないのは確認しましたが…。
474 :
・∀・)っ-○◎● ◆toBASh.... :2006/04/30(日) 04:40:01
RPC使う方法しか思い浮かばない
CreateProcess で CUI プログラムを呼び出す時、
仮想端末を出さずに暗黙的に実行するには、どうしたら良いのでしょうか?
>>473 デスクトップが異なるとメッセージはとどかない。はず。
>>476 やはりダメですか。
>>474 私へ回答いただいたんですよね。RPC、調べてみます。使ったこと無いですが…。
//
>>479 // 起動したら後は野となれ山となれ
bool CUtility::execProcess(const char * cmd)
{
if (cmd == NULL || cmd[0] == '\0') {
return false;
}
PROCESS_INFORMATION pi;
STARTUPINFO sui = {sizeof(sui),};
if (!CreateProcess(NULL, const_cast<char *>(cmd), NULL, NULL, false,
NORMAL_PRIORITY_CLASS | DETACHED_PROCESS,
NULL, NULL, & sui, & pi)) {
return false;
}
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
return true;
}
>>478 プロセス間通信がしたいだけなら
pipe,named pipe,mailslot
あたりの方が簡単じゃなかろうか。良く知らんねんけどね。
あとはCOMの世界に走るとか。
org 100H
484 :
デフォルトの名無しさん:2006/04/30(日) 14:16:54
こんにちは、文字の書き方について教えていただきたいのですが、
フォント指定した文字列をあるポイントから右寄せで表示したいのです。
自作した、四角形がありその中に右寄せで文字を表示したいのです。
なにか、関数とかあるのでしょうか。それとも計算して、書いていくのでしょうか。
計算して書くのが一番悩みが少なくて済む。
486 :
デフォルトの名無しさん:2006/04/30(日) 14:47:04
>484です
>485さんありがとございます。そうします。
>>484 ちなみにAPI関数でやるとしたら、たとえばDrawTextにDT_RIGHTを指定すればよい。
見当がつかない物を作らない方がいいよ。
>>488 わざわざ新しく作らないでそれを使えばいいじゃん
つ 逆アセンブラ
>>490 実行中のすべてのプロセスに対して
速度変更ができるようにしたいからです。
かなりハードよりな分野だから
自分で解析できないレベルなら無理だと思うよ
api一発叩けばできるレベルならみんなやってるだろうし
HOOKするならVS限定だけどspy++大活躍だな
>>493 ご助言、ありがとうございます。
ハードよりな分野とは知りませんでした。
この手のソフトウェアは大抵hook.dllがありましたので
APIフックで実装可能と思っていましたorz
496 :
473:2006/04/30(日) 21:27:32
>>482 いま作ってみましたが、mailslotはダメでした。
うーん…
497 :
475:2006/04/30(日) 22:45:39
>>480, 481
ありがとうございます
頑張って試してみます m(_ _)m
498 :
デフォルトの名無しさん:2006/04/30(日) 22:57:50
>>487さんありがとうございます。
DrawText()あるんですね。
いろいろ書いてみます。最初なので、書いて試していろいろして見ます。
ありがとうございました。
499 :
デフォルトの名無しさん:2006/05/01(月) 08:29:07
不安で夜も眠れないのでよろしくお願いします。
開発環境: w2k + VC++6.0
CreateWaitableTimer() の使用を考えております。
<winbase.h>をインクルードししこしこ使おうと考えるも
「そんなもんねーよ」って怒られちゃいます。
原因を探ると、os対応の問題のようで
#define _WIN32_WINNT 0x0400
マクロぶち込んでやると、コンパイルも通りとりあえずは動くのは
動くのですが。
API自体が、2k以上対応って話なのでこれで問題ないような気もするのですが
ぶっちゃけ対応過ぎるような気がして。
対処方法としてこれでよろしいのでしょうか?
有識者の意見をいただければ幸いです。
なにが問題なのかが分からないのだが
ぶっちゃけ対応って何?
最近の日本語はおぢさんには難しい。
CreateWaitableTimerA()にしてもだめかい?
MSDNには
>Requires Windows Vista, Windows XP, Windows 2000 Professional, Windows NT Workstation 4.0, Windows Me, or Windows 98.
って書いてあるけどなあ。
505 :
デフォルトの名無しさん:2006/05/01(月) 12:46:26
>>499 最悪、LoadLibraryを用いてGetProcAddressで呼んでみる?
・・・など、いろいろあるお。
506 :
デフォルトの名無しさん:2006/05/01(月) 12:54:02
ねぇ、ここにいる先輩方は、
日本語配列(109)キーボード?それとも、英語配列(101)キーボード?
教えて、みんな。
101と109かよ!
スレ違い
509 :
デフォルトの名無しさん:2006/05/01(月) 13:50:02
>>499 です。
色々返答有難う御座いました。
>>503 オンラインのMSDN見ると確かに2k前に対応してると書いてますね。
HDDに入ってる2003、4月リリース版だとダメって書いてるのに!
>>502 >>505 色々手はあるようですね。
教えてもらった情報元にもう一度考え直して見ます。
CreateWaitableTimerA() は無いって言われます(調べ直ししてみます)。
他の作業にかまけて放置して後でハマるありがちなパターンだけは避けるよう
心がけます。ありがとう御座いました。
510 :
デフォルトの名無しさん:2006/05/01(月) 13:55:18
>>499 です。
すいません。
サービスパックさえ当たってませんでした。
人に聞く前に環境整えからですね。
511 :
506:2006/05/01(月) 14:27:51
おまいら、新スレたてっぞ、こたえんかい!
512 :
デフォルトの名無しさん:2006/05/01(月) 14:53:52
ウィンドウの外枠を外す方法があった気がした。
CreateWindowExの引数弄るだけで出来る?
他になにかAPIが必要?
教えておくれ
>>499 自分でヘッダ見ろよ。
winbase.hのCreateWaitableTimerA/Wの宣言の直前にこれがあるだろ。
#if (_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)
516 :
デフォルトの名無しさん:2006/05/01(月) 17:32:02
>>514 スタイルのボーダー指定をしなきゃいいだけジャマイカ?
517 :
514:2006/05/01(月) 19:29:59
>>516 WS_SYSMENU だけでも表示される件
そりゃそうだ
>>504 hookでできました。
ピンボールが2倍速になって難しくなりました。
520 :
デフォルトの名無しさん:2006/05/01(月) 20:54:09
>>519 bmaxと入力すればボールが減らなくなる
エリクサーちょうだい
乙女のキッスクレ
どうやったのかだけでも
散々偉そうに意味のないレス書き散らしといて
今度はソースよこせかよwwww
>>525 見当がつかない物を見てもしょうがないよ。
質問があります。
Cで作ったプログラムにインストーラをつけるにはどのようにしたらいいのでしょうか?
VisualBasicとかならやり方はみた気がするのですが、Cでは見たことがないような・・・
100%見逃している感がありますが、参考になるような分かりやすいサイトがあれば教えてください。
お願いします
まあ取りあえずスレ違いだ
>>528 えっ?
そうなの?
んじゃ、どこで聞いたらいいの?これ?
531 :
514:2006/05/02(火) 11:22:32
age
ってだれか分からんですかー
>>531 スタイルのボーダー指定をしなきゃいいだけジャマイカ?
>>531 よく知らんけど、どういう風にやってうまくいってないのか
コード晒してみたら?
ExtractIconでアイコンの数が取得できますが、それぞれのアイコンのリソースIDはどうやったら分かりますか?
535 :
デフォルトの名無しさん:2006/05/02(火) 12:47:13
>>534 EnumResourceTypesじゃダメ?
いぢめる?
536 :
デフォルトの名無しさん:2006/05/02(火) 13:04:02
スレ違いで申し訳ない。
みなさん、GIFファイルをLockBitsしてポインタでゴリゴリするとき、
画像内の任意のピクセルが黒かどうかを確認するときどうします?
ただし、GIFファイルは256色で保存されており、
GIFファイルのパレットには、ff000000がたくさんエントリーされているものとする。
みんなさん、よろしく!
537 :
536:2006/05/02(火) 13:05:29
private bool isBlack(Color color)
{
if (color.R == 0 && color.G == 0 && color.B == 0)
{
return true;
}
else
{
return false;
}
}
こんなのつくって、
if (!isBlack(bitmap1.Palette.Entries[*p1]))
こんなことすると、ものすごく遅いんです。
538 :
536:2006/05/02(火) 13:13:40
>>536 そんなときは私はAPIを使わず、適当なライブラリで読み込んだ画像をメモリ上で検索するが。
具体的な方法はスレ違いなんで割愛。
つーか、画像の大きさにもよるけど24ビット画像に変換した方が楽じゃね?
つかおまい前にも来てたが、スレ違いだっつーの
541 :
536:2006/05/02(火) 13:27:08
>>539 もうちょい初心者にもわかりやすくお願いします・・・。
(ちなみに、GetPixelとかそういう遅い関数は遠慮したいです)
だいたい3000*3000ピクセル程度の画像を扱っています。
542 :
536:2006/05/02(火) 13:28:14
>>540 だって、ここのスレにいる方々が2chで一番知識豊富なんですもの・・・。
ほんとにごめんなさい。おねがいします。
543 :
536:2006/05/02(火) 13:30:18
GIFファイルを24bit配列にする方法ってあるのですか?
つまり、byte mybyte=new byte[bmp.Height*bmp.Width*3];
っていう配列を用意してってことですよね??
ごめんなさい、ほんとあほで。
>>541 Palette.Entries[n]ってのを取ってきて isBlack で判定するのが遅いと感じたなら、
最初に0〜255までの各パレット値について、
bool _isBlack[] = new bool[256]; ってのに全部の結果を入れとけばいいでそ?
その関数を900万回も呼ぶより、256回だけ呼んで、あとは配列の参照の方が
速そうだな、とか思うデソ?
こういうことは Win32 API とも C# とも GDI+ とも関係なく、普段からちゃんとものを
考えて暮らしていればごく普通に考えればわかる。
だからスレ違いだといわれてるわけです。
でもまぁ懲りずにまた何か質問あったらここで聞いても良いと思う。
プログラミングの常識みたいなものも、そのうちだんだん解ってくるから頑張って。
545 :
531:2006/05/02(火) 13:32:54
>>532 WS_SYSMENU だけでも表示される件
ボーダー指定とかナニソレ
>>533 うまくいってないとかじゃなくて、そう言う方法があったと思うんだけどーって話。
もう一回書く
ウィンドウの外枠を外す方法があった気がした。
CreateWindowExの引数弄るだけで出来る?
他になにかAPIが必要?
教えておくれ
546 :
536:2006/05/02(火) 13:37:44
>>544 どうもありがそ。よく理解できました。
bool _isBlack[] = new bool[256]; ってのに全部の結果を入れとけばいいでそ?
確かにこれははやそうです!
ひょっとしたら、もっともっとスマートな所謂定石の方法が
他にあるんじゃないかとも感じたのです。
だから初心者スレ辺りでやれよ。
そうしたらコードの添削もしてやれるしこっちのコードも提示できるから。
548 :
536:2006/05/02(火) 13:57:22
>>547 仰るとおりです。今度からそちらで質問させていたらきます。
どうもありがとうございました。
byte[] isBlack= new byte[Byte.MaxValue];
byte[] isWhite = new byte[Byte.MaxValue];
for (int i = 0; i < 256; i++)
{
isBlack[i] = false;
isWhite[i] = false;
Color color = bitmap1.Palette.Entries[i];
if (color.R == 0 && color.G == 0 && color.B == 0)
{
isBlack[i] = true;
}
if (color.R == 255 && color.G == 255 && color.B == 255)
{
isWhite[i] = true;
}
}
549 :
デフォルトの名無しさん:2006/05/02(火) 13:59:34
質問です。
タブコントロールを扱っているのですが
タブコントロールが可視状態の時に
SendMessage(
GetDlgItem(hWnd, IDC_TAB),
TCM_DELETEITEM,
(WPARAM)1,
(LPARAM)0
);
とすると、タブの上にのっているコントロールが全て消えてしまいます。
SPY+でメッセージを見る限り
TCM_DELETEITEMが処理されるとWM_ERASEBKGNDが処理されるようです。
「なら、その後にWM_PAINTを送ればいいかな」
と思いTCM_DELETEITEMをSendした次の行で、WM_PAINTをSendしてみましたが状況は改善されず。
何故か
TCM_DELETEITEM
WM_PAINT
WM_ERASEBKGND
という順番で処理されてしまいます。
タブコントロールを動的に扱う時は、どうやってこのWM_ERASEBKGND問題を回避するのでしょうか。
WM_PAINTはアプリケーションが送る物でないと(ry
InvalidateRect(ry
>>550-551 ありがとうございました。
WM_PAINTを送るかわりにInvalidateRectを使ったら即解決しました。
Javaから帰還して「ん、再描画はなんだっけ。repaint?違うな。UpdateWindowだっけ?」
とドツボにはまってましたorz
553 :
デフォルトの名無しさん :2006/05/02(火) 14:30:37
猫でもわかるWINDOWSプログラミングを見ながら勉強しつつ
使う関数の意味合いや使った関数の意味をあいまいな説明
なままのでいらいらして、とりあえずWIN32APIオフィシャルリファレン
スを買った程度のレベルの猫以下の自分から質問さしてください。
・SelectObject()で選んだObjectは必ずDeleateObject()しない
といけないんでしょうか?大きなプログラムになるともったいない
ので、Create用に宣言した物を使い回す為にDeleateObject
するんでしょうか?
・リソースはみなさん手描きなんでしょうか?
・LOWORD()等のマクロがあるという事を知るにはどうやって調べて
いるんでしょうか?
・今VS2005SEを使ってるんですが、ソースの文字列を全部
TEXT()で囲んでるんですが、VC++6だとだめでした。
結局は、場所に応じてL""にしたりすべきなのでしょうか?
くずみたいな質問すいません。勉強にもどります。
554 :
デフォルトの名無しさん:2006/05/02(火) 15:12:56
>>553 First, you d beter recognize ur words r unclear
>>535 ありがとうございます。EnumResourceNamesというのでいけました。
556 :
545:2006/05/02(火) 16:25:36
WS_POPUP だけにしたら出来ますたorz
WS_POPUPが無い時点でタイトルバー、外枠とかは絶対ついてくるのね・・・
勉強になりますた
VMWare + Windows98SE で↓な結果が出たんですけど仕様ですかね?
::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);
(ry
case TM_DESTROY:
PostQuitMessage(-1);
break;
case TM_QUIT:
msg.wParam; // 0x0000ffff が入ってる
560 :
デフォルトの名無しさん:2006/05/02(火) 17:16:19
>>553 ●SelectObject()で選んだObjectは必ずDeleateObject()しない(ry
ちょっと質問の意味がわかりませんが、GDIオブジェクトを生成するCreate〜に対し、
GDIオブジェクトを破棄するのがDeleteObjectではないでしょうか?
SelectObjectはデバイスコンテキストと、GDIオブジェクトを関連付けているのではないでしょうか?
●リソースはみなさん手描きなんでしょうか(ry
アイコンとかは、ツールを利用した上で手書きじゃないでしょうか?
私はフォトショップで加工して手書き補正です。
●LOWORD()等のマクロがあるという事を知るにはどうやって調べて(ry
リファレンスを読む
ファイルから検索で#defineを検索する。
人に教えてもらう。
神の啓示。
●今VS2005SEを使ってるんですが、ソースの文字列を全部(ry
汎用データマッピングを利用するには、
#include <tchar.h>
#include <clocale>// 必要に応じて
をソースの頭の記述しておく、
これにより汎用データマッピング用の関数を利用できる。
(実際はマクロ)
ex) 汎用データマッピング用書式付出力
_tprintf(_T("ゴルァ World!\n"));
これが、マルチ文字環境だと
printf("ゴルァ World!\n");
ワイド文字環境だと
wprintf(L"ゴルァ World!\n");
なる。
>>556 WS_オーバーラップトだったかそのへんが0ってことで
>>559 XPでは 0xffffffff なのに問題無いとでも?
563 :
556:2006/05/02(火) 17:44:00
>>558 ん?答えなんかあった?
>>561 そういえばそうだった。
てことはつまり WS_POPUP は WS_OVERLAPPED じゃないってこと?
いやその辺りは自分で調べてみます。
どうもですた
>>562 終了ステータスは32ビットってどっかに書いてあった?
単に16ビットしか有効じゃないだけじゃないの?
>>563 WS_SYSMENUを指定したら枠がつく>そりゃそうだ
↓
WS_SYSMENUを指定しない(≒WS_POPUPでも指定する)
>>560 レスありがとうございます
まだ何がわかってて何がわかってないかさえ分かってない
レベルだとわかりました。
とりあえず、もっとゴリゴリ書いて経験積みます。
デバイスコンテキストをバックバッファとして使いたいのですが
char * str = "foo";
HDC hdc2 = GetDC(hWnd);
TextOut(hdc2,x,y,(LPCSTR)str,strlen(str));
ってことをやったとして、これを画面に出力したいときは
BitBlt 使う以外に方法ありますか?
的外れな質問だったらスマソ
まとはずれです。
メモリDCとかで調べてみてください。
569 :
557:2006/05/02(火) 19:09:21
>>564 > 終了ステータスは32ビットってどっかに書いてあった?
> 単に16ビットしか有効じゃないだけじゃないの?
WinMainより
> WM_QUIT メッセージの wParam パラメータで受け取った値を返さなければなりません。
なるほど納得した
サンクス
>>564 > 終了ステータスは32ビットってどっかに書いてあった?
でも、
> VOID PostQuitMessage(int nExitCode);
> nExitCode
> この値は、WM_QUIT メッセージの wParam パラメータとして使われます。
intもWPARAMも32ビットなのに、16ビットしか有効じゃないってのは・・・
MSDNのexit()には、
>exit 呼び出しおよび _exit 呼び出しは値を返しませんが、待機中の呼び出しプロセスがある場合は、
>現在の呼び出しプロセスが終了した後で、待機中の呼び出しプロセスが status の下位バイトを利用できます。
>status の値は、オペレーティング システムのバッチ コマンド ERRORLEVEL を使用して、2 種類の定数で表すことができます。
>つまり、定数 EXIT_SUCCESS を値 0、定数 EXIT_FAILURE を値 1 として表します。
と書いてあるんだよね。
これだけ見ると、16ビットどころか8ビットしか使えない。
572 :
デフォルトの名無しさん:2006/05/02(火) 20:26:19
GetExitCodeProcess関数の説明では、
甲 - ExitProcess関数またはTerminateProcess関数の中で指定された終了コード
乙 - プロセスのmain関数またはWinMain関数からの戻り値
丙 - 処理されない例外のためにプロセスが終了した場合は、 その例外コード
>>570 Win 9xは16ビット時代を引きずっているからそんなもんだろ。
>>571 どこかでプロセス内の最後のスレッドがExitThreadしたら、
そのスレッドの終了コードがプロセスの終了コードになると書いてあった覚えがある。
574 :
デフォルトの名無しさん:2006/05/02(火) 22:09:35
こんばんは、
HFONT の fnWeight を取得するには、どうすればいいのでしょうか教えてください。
テキストの中を均等割付したいのですが、そう見せかけるだけで、
四角の枠の中に均等に文字が入るように、計算しようと思いす。
ので、フォントの幅で、計算すると出てくるかなと思いまして。
一文字ずつ幅を計算していけばいい。
>>574 fnWeight ってのが何なのかわからないけど、
フォントの幅・・というのが文字の幅のことなら、
文字によって違うから GetTextExtentExPoint とか
GetCharacterPlacement とか使ったほうが良い。
>>574 均等割り付けと言えばSetTextCharacterExtraやSetTextJustificationもお忘れなく、一応ね。
579 :
デフォルトの名無しさん :2006/05/02(火) 23:09:18
すいません、教えてください
下の定義したDlgPrc()でリンクのエラー
「_MyDlgProc@16 が関数 _WndProc@16 で参照されました」
がでたのですが、何のライブラリを
#pragma comment(lib, "・・・")
で読み込めば良いのでしょうか
DefDlgProcを返そうと思いましたが返る値がLRESULTなので
わけがからなくなりました。
どなたか教えてください
BOOL CALLBACK MyDlgPrc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
static HWND hParent;
switch(msg){
case WM_INITDIALOG:
return TRUE;
case WM_COMMAND:
switch(LOWORD(wp)){
case IDOK:
・
・
・
case IDC_CLOSE:
DestroyWindow(hDlg);
return TRUE;
}
return FALSE;
}
return FALSE;
}
580 :
デフォルトの名無しさん:2006/05/02(火) 23:12:48
>>574です
>>575-578さんありがとうございます。
今いろいろ教えていただいたのを調べていますので、
また、結果かきます。ありがとうございました。
>>579 MyDlgPrcをMyDlgProcに直せ。
sendmessageにてマウスを上下にしか移動出来なくすることって出来ますか?
584 :
579:2006/05/03(水) 00:03:11
>>582さん
ありがとうございましった
アホでした
>>583 SendMessage以外の方法なら知ってる。
マウスを!?
SendMessageは無理ですか?
LBUTTONDOWN中のみそうしたかったのですが・・・
して、そのSendMessageの方法とは?
教えてください、お願いします。
588 :
587:2006/05/03(水) 00:29:41
3行目に「以外」を付け忘れますた
589 :
デフォルトの名無しさん:2006/05/03(水) 00:38:54
飲んでインザ終電の漏れに言わせればるとそれはクリップカーソーさ
>>587 ClipCursor()を使って無理やり。
LRESULT WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
RECT rc;
switch (uMsg)
{
// 中略
case WM_LBUTTONDOWN:
rc.left = rc.right = LOWORD(lParam);
rc.top = 0;
rc.bottom = 768; // どうでもいい
ClipCursor(&rc);
break;
case WM_LBUTTONUP:
ClipCursor(NULL);
break;
// 中略
}
たしかに無理やり出来そうですね。
戻し忘れたときが恐そうですけどね。
戻し忘れたら、他のプログラムがClipCursor(NULL);するか再起動しない限り
マウスカーソルが上下にしか動かない。
すみません
bool myWin::Message(){
if(!GetMessage(&msg, NULL, 0, 0))
return FALSE;
TranslateMessage(&msg);
DispatchMessage(&msg);
return TRUE;
}
このようなクラスメンバ関数を作ったのですが
windowsから何もメッセージが送られてきていないとき、何かメッセージが送られてくるまでここで待機してしまってるみたいなんです。
何か対策はありますか?
よろしくお願いします。
つ PeekMessage
>>594 ありがとうございます。
でもPeekMessageだと期待したような動作をしてくれなかったので
いろいろ試した結果下のような変更で解決しました。
bool myWin::Message(){
bool f;
f=GetMessage(&msg, NULL, 0, 0);
TranslateMessage(&msg);
DispatchMessage(&msg);
if(!f)
return FALSE;
else
return TRUE;
}
596 :
593:2006/05/03(水) 19:44:51
ごめん、すげー早とちりした
回線切って首つってきまつ
このとおりだから許してあげて
∧||∧
>>596( ⌒ ヽ
∪ ノ
∩∪∩
(・∀・| |
| |
⊂⊂____ノ
彡
___________
だが、ゆるっさん!
599 :
597:2006/05/03(水) 20:12:53
許さないかぁ
それならさらに罰を与えましょう、そうしましょう。
600 :
471:2006/05/03(水) 22:37:42
>>600 多分WM_GETMINMAXINFOが関係してる。
602 :
600:2006/05/03(水) 22:51:58
ありがと、ほんまだ!
けど、
なんでEDITが0で、BUTTONが0じゃないのか?
603 :
デフォルトの名無しさん:2006/05/03(水) 23:00:45
>>574です
こんばんは、いろいろ試してみた結果、
GetObject でHFONT を指定して、LOGFONT を取得すると、
HFONTに、高さのみ指定している場合は、幅がマイナス値になるようなのです。
(間違いかもしれませんが、)ので、GetTextExtentPoint32で、
SIZEを取得して、計算しました。
SetTextJustificationを使って表示させると、何回も呼び出した場合。
不具合が、発生しましたので、その後の表示は、一文字づつ呼び出し
TextOutでかきました。
どうも、文字全体をまとめて表示すると、文字化けになるので、
苦労します。
なお、GetObject はフォントダイアログ呼び出しの
初期値設定に使うことができ感謝してます。
それでは、みなさまありがとうございました。
1文字ずつ書くとClearTypeかけたときに結構表示が汚くなることがあるから個人的にはやめてほしい。
マルチバイト文字列を、全角文字を考慮して(全角文字で分割しない)
指定長さ(バイト数)以下に入るよう切り詰めるAPIってないですか?
例えば "あいう\0" を6バイトのバッファに入れる場合
単純に切り詰めると "あい(うの1バイト目)\0" となってしまうので
その場合は "あい\0" となるように。
ShiftJISの頭のコードを判別してバッファに入れてやればいいだけ。
それは分かってるんですが、API一発で出来たらいいなあと。
探さなくてもあるけど
>>607 たとえAPI一発でやれるとしても、それは内部で同じ事をやってくれるだけだろう?
自分でその機能を持った関数を作って、それを一発呼ぶ事の何が嫌なんだ?
車輪の再発明はしたくない
str系の関数、apiがあるだろ
文字コードがShiftJISとは限らない
考えるのが嫌なんだよ!!!
考えるのが嫌なわけではなく、自分で書いた場合テスト・保守などの手間がかかり
十分テストされている(と思われる)APIでできるのならそれに越した事は無いな
と思っているのですが。
>>611 C標準のstrncpyだと全角文字考慮されていないようですが…
char buf[6];
strncpy(buf, "あいう", 5);
buf[5] = '\0';
// buf[4]に「う」の1バイト目が入っている
質問の前にMSDNぐらい見よう
他人が検証済みのロジックを、WEBなりで調べて実装するのは再発明では無い。
他人の作った設計図を元に、車輪を作ることを再発明だと思っているのか?
再発明の意味を分かっていないのに使う奴のあまりの馬鹿さかげんに涙が出てくる。
>>615 見ていますが、lstrcpyn, StrCpyN, StringCbCopyN, StringCchCopyN
全てアウトだったのですが。
>>614 文字コードを全てUTF16で表現すれば解決。
今後Win32APIを使っていくのならUNICODEが常識。
地域依存コードなど使えば,
>テスト・保守などの手間がかかり
問題が出る。
ええと、仕様でマルチバイト対応でなければならないんです。
>テスト・保守などの手間がかかり
>十分テストされている(と思われる)API
を使うため、仕様を変更すればいい。
調べるのめんどくさいんだよ!!!
だよな。ここで訊いて誰かが答えるの待ってた方が早いし。
自己解決しますた。
だからマルチバイト対応が仕様ならば、必要な機能を実現する上で
>テスト・保守などの手間がかかり
これが必要なわけだろ。その分の工数を見込んでいなかったのであれば
それは見積もりミスであって、APIのせいではない。
>>605 APIがあるかないかが分かればいいのなら、無い。
>>625 ありがとうございます。無いと分かっただけで十分です。
あるか無いかの質問なのに、的外れな回答が多いな。
かと思えば
>>138-139みたいな素っ気無いやりとりがあったり
基準がよくわからん。
確かに
>>614はダメみたいだが
lstrcpynで常識的なやり方でやったらできた。
>617はlstrcpynでできなかったのか
できたぞ
>>630-631 もしかして
char buf[6];
lstrcpyn(buf, "あいう", 5);
buf[5] = '\0';
で出来たとか言ってる?
"あいう"じゃなくて"aあい"だとダメだよ。
lstrcpyn
指定された文字列を、指定した文字数分だけ、バッファにコピーします。
LPTSTR lstrcpyn(
LPTSTR lpString1,// バッファへのポインタ
LPCTSTR lpString2,// コピー元文字列へのポインタ
int iMaxLength// コピーするバイト数または文字数
);
解説
iMaxLengthパラメータで指定する値は、終端のNULL文字分も含みます。
たとえば、次のプログラムを実行すると、
"abc"と終端のNULL文字が、chBufferにコピーされます。
TCHAR chBuffer[512] ;
lstrcpyn(chBuffer, "abcdefghijklmnop", 4) ;
----------------
MSDN↑意味不明だけど
iMaxLength これはバッファの大きさだから5バイト分あれば十分
終端もコピーしたあとで自分で入れる必要ない
結局lstrcpynはマルチバイト考慮せずぶった切るから駄目だな。
だからlstrcpynは文字数じゃなくてバッファのサイズ指定な
_mbsnbcpy で出来るんじゃねーのー♪
と思って試してみたら、NULL終端を入れてくれなかった。
CRTのソース追ってみたら確かに
buff[6];
"あいう"
だとNULL終端コピってくれない。
ただ、ウチの環境古いんで最新のP SDKで誰かやってみて。
あと、セーフバージョン *_s とか。
例を示しただけだろ
小出し
>>636 _mbsnbcpyの中で_ISLEADBYTE使ってるから
途中で切れることはない
終端は頭使えば何とかなる。
wchar_tの使い方がいまいちわかりません。
char型からwchar_t型に変えたとき、
strlenなどをwcslenに変えなくてはいけないのはわかりました。
けど、引数がchar型の関数(MessageBox)を呼び出すときはどうしたらいいのでしょう?
>>641 WideCharToMultiByte等で変換するかMessageBoxWを使う。
MessageBoxWというのがあるのですね!!
もしかしてほかの関数も似たような命名規則でしょうか?
>618
サロゲートペアの後ろ半分だけ残る希ガス。
>>636 mbだろうがなんだろうが、strncpy系の関数はバッファサイズ一杯まで
つめたときには末尾のゼロは入らない仕様。
buff[6] だとどうせ5バイトしか使えないわけだから、_mbdsbcpy では
バッファサイズ5を指定して自分で先にbuff[5]=0とするのが正しい使いかた。
昔はAPIの日本語HELPがあったけど、今そういうのって無いんだね…
難儀な世の中になったもんだ。
ListViewに表示されるスクロールバーのハンドルを得るにはどのようにすればいいのでしょうか?
なにをどうやっても得られません。
何がやりたいんだろうね?
自分でスクロールさせたいとか?
652 :
デフォルトの名無しさん:2006/05/05(金) 07:47:26
>>647 Borland C++ 4.5J の win32api.hlp は今でも時々つかう
653 :
デフォルトの名無しさん:2006/05/06(土) 01:10:12
ウィンドウを、タイトルバーをつかんだりシステムメニューから移動させたあと
移動が確定した時に発行されるメッセージってありますか?
WM_WINDOWPOSCHANGEDとかはドラッグ中もばしばし送られて来るのでちょっと違う…
WM_WINDOWPOSCHANGEDでフラグ立てて左マウス離された時とかも考えたけど
なんかスマートじゃない気が
WM_EXITSIZEMOVE
655 :
653:2006/05/06(土) 07:32:00
あざ〜〜〜すっ!
どうでもいいけど、文字で「あざ〜す」ってのは
他人を馬鹿にしているのかよっぽど自身が馬鹿なのかどっちかにしか見えないな。
どうでもいいと言いながらレスするのは
馬鹿にしか見えないなw
真剣に考えると、返事してくれて嬉しい
659 :
デフォルトの名無しさん:2006/05/06(土) 09:44:33
>>656 なんか攻撃的だな
きっとカルシウム不足だぞw
660 :
636:2006/05/06(土) 15:47:36
>>646 なるぺそ、そうなのか。
strncpyの仕様確認してみます。サンクス。
どうでもいいけど、カタカナで「サンクス」ってのは
他人を馬鹿にしているのかよっぽど自身が馬鹿なのかどっちかにしか見えないな。
どうでもいいけど、言い出しが「どうでもいいけど」ってのは
他人を馬鹿にしているのかよっぽど自身が馬鹿なのかどっちかにしか見えないな。
どうでもいいけど、言い出しが「どうでもいいけど」って言っておいて「どうでもいいけど」を批判するのは
他人を馬鹿にしているのかよっぽど自身が馬鹿なのかどっちかにしか見えないな。
char header[]="どうでもいいけど、";
char core[]="言い出しが「どうでもいいけど」って言っておいて、";
char footer[]="「どうでもいいけど」を批判するのは他人を馬鹿にしているのかよっぽど自身が馬鹿なのかどっちかにしか見えないな。";
for(int i=1;;i++){
printf("%s",header);
for(int j=1;j<i;j++) printf("%s",core);
printf("%s\n",footer);
}
どうでもいいけど、「どうでもいいけど」を批判するのは他人を馬鹿にしているのかよっ
ぽど自身が馬鹿なのかどっちかにしか見えないな。
どうでもいいけど、言い出しが「どうでもいいけど」って言っておいて、「どうでもいい
けど」を批判するのは他人を馬鹿にしているのかよっぽど自身が馬鹿なのかどっちかにし
か見えないな。
どうでもいいけど、言い出しが「どうでもいいけど」って言っておいて、言い出しが「ど
うでもいいけど」って言っておいて、「どうでもいいけど」を批判するのは他人を馬鹿に
しているのかよっぽど自身が馬鹿なのかどっちかにしか見えないな。
どうでもいいけど、言い出しが「どうでもいいけど」って言っておいて、言い出しが「ど
うでもいいけど」って言っておいて、言い出しが「どうでもいいけど」って言っておいて
、「どうでもいいけど」を批判するのは他人を馬鹿にしているのかよっぽど自身が馬鹿な
のかどっちかにしか見えないな。
・
・
・
666 :
656:2006/05/06(土) 18:01:44
どうでもいいけど、喪前等大好きだv
いや、俺は嫌いだけど。
わしも小学生の頃は好きな子にわざと嫌いなふりをしてしまったものじゃ。
あ〜ら、あたしもよ。
さすがにうざいんでやめてくれよ
つれない子ね
672 :
デフォルトの名無しさん:2006/05/07(日) 12:46:56
サブクラス化したプロシージャ内で他のコントロールの値を取得するにはどうしたらいいのでしょうか
GetDlgItemText(hWnd, ID_hogehoge, (LPSTR)hogehoge, 20);
とやっても無理でした…orz
675 :
デフォルトの名無しさん:2006/05/07(日) 14:34:13
こんにちは
HFONT について教えてください
HFONT を(中身の構造)保存して、呼び出したいのですが、
HFONTからLOGFONT を取り出して、その構造体をテキストファイルに書き出しているのですが、
ofstream of;
LOGFONT hont;
of.open(filename,ios::out);
of << dec << hont.lfHeight << endl;
of << dec << hont.lfWidth << endl;
of << dec << hont.lfEscapement << endl;
of << dec << hont.lfOrientation << endl;
of << dec << hont.lfWeight << endl;
of << hex <<hont.lfItalic << endl;
of << hex << hont.lfUnderline << endl;
of << hex << hont.lfStrikeOut << endl;
of << hex << hont.lfCharSet << endl;
of << hex << hont.lfOutPrecision << endl;
of << hex << hont.lfClipPrecision << endl;
of << hex << hont.lfQuality << endl;
of << hex << hont.lfPitchAndFamily << endl;
of << hont.lfFaceName << endl;
こんな感じで
テキストファイルにはlfItalic とlfUnderline lfStrikeOut
は空白です。それを読み込んで、LOGFONT として、
それをHFONT に一つ筒今度は渡しているのですが、
アンダーラインも取り消し先もすべて、ついてしまうのです。
どうすればフォントの保存ができるのでしょうか。教えてください。
676 :
デフォルトの名無しさん:2006/05/07(日) 14:58:11
>>675です。
とりあえず力技で、空のときはFALSE としました。
677 :
672:2006/05/07(日) 15:27:04
>>674 自作関数にhWndを渡して、関数内でGetDlgItemTextでコントロールの値を取得できたので、
サブクラスのプロシージャでもGetDlgItemTextで出来るのかと思ってやったら出来なかったので…
取得したいコントロールのハンドルをグローバルにして
GetDlgItemText([グローバル変数にコントロールのハンドル], ID_hogehoge, (LPSTR)hogehoge, 20);
にすると取得できるのですが、グローバル変数を使わない方法はどうするのでしょうか…
>>675 まずは、LOGFONTの構造から見直せ
>>677 674ではないが、
findwindow
猫でもわかるWindosプログラミングで勉強してる初心者だけど
やけに変数初期化してない所が多くて
グローバル変数は勝手に0で初期化されるとはいえ
やっぱ全部初期化した方が良いっすよね?
それとも、面倒な所はほっとけって感じで思っておいた方が
書いていくのは楽なんでしょうか
>>680 きっちり初期化するべし
趣味ならいいが、仕事なら癖つけとけ
猫はAPIの使い方を見るサイトなのであって、
その他すべてのことは一切参考すべきではない
683 :
672:2006/05/07(日) 16:19:10
>>679 FindWindowで出来ました、ありがとうございました
複数起動していてもアクティブの方で取得してくれるので便利な関数ですね
WFP(Windows File Protection)で保護されているファイルを書き換えるにはどうすればいいのですか?
よくソフトのインストーラなどが再起動時にファイルを書き換えているみたいですが、これをやるにはどうすればいいのでしょうか?
687 :
デフォルトの名無しさん:2006/05/07(日) 19:30:44
このケースだとsscanfかな
688 :
デフォルトの名無しさん :2006/05/07(日) 21:32:45
質問さしてください
コントロールのリストボックスの初期化で
hList1 = GetDlgItem(hDlg, IDC_LIST2);として
ボックス内のリストを
ListBox_AddString(hList1, szListBirthYear[i]);
で加えていって
ListBox_SetCurSel(hList1, nBirtY);
[nBirtY はINT型グローバル変数で0として初期化]
で、ListBox_SetCurSel()の第二引数は
何を設定しているのかがわからず、一応入れてある
だけの状態です。
でダイアログプロシージャ内で
case WM_COMMAND:
switch(LOWORD(wp))内の
case IDC_LIST2:で
id = ListBox_GetCurSel(hList1);
wsprintf(szText[1], L"%sが選択されました",
szListBirthYear[id]);
InvalidateRect(hMain, NULL, TRUE);
nBirtY = id;
return TRUE;
としてるのですが、実行してみるとIDC_LIST2のボックスに
加えた文字列、及びスクロールバーが表示されないです。
ただ、そのリストボックスをクリックすると空表示ですが
リストに加えた最初の文字列はウィンドウに反映されます
これは、リソースのプロパティ設定の不備なのでしょうか
それとも、ソースで足りない処理があるのでしょうか
どなたか教えて下さい。
>>688 もうちょっと読みやすく書く癖をつけましょう。
690 :
688:2006/05/07(日) 22:45:13
>>690 ソースから解析するのだりぃから、まずexe実行して現象を見てみようと思って、
コンパイルしたらresource.hが見当たらないのでコンパイルできなくて断念です。
ソースで説明するのではなく、ある程度日本語で解説するよう心がけましょう。
>>691 いや、いまやってる最中だが、resorce.h作って、
.rcからID〜を見つけては.hに
#define ID〜 番号//重複しない値
をふってくのは常識だよ。
後は、
#include <windows.h>
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <tchar.h>
#include<resource.h>
の順にインクルードされるようにしてやる
しゅんません
今からAPIやるのに適した言語なんでしょ?
694 :
デフォルトの名無しさん:2006/05/08(月) 02:14:14
>>690 分かったよ。
hDlg = CreateDialogとせっかくメインウィンドウと別枠でハンドル作ってるのに、
BOOL CALLBACK MyDlgProc(HWND hWndとやってるからまずい。
MyDlgProcないのイベント処理は、hWndであるが為になんとメインウィンドウにメッセージが来たときの処理になってる。
BOOL CALLBACK MyDlgProc(HWND hDlgとすればいい。
あと、LISTBOX2のリソースのプロパティで垂直スクロールちぇきら!してやれば、そこまでの造りとしては思っているものと一致すると思うが。
>MyDlgProc内のイベント処理は、hWndであるが為になんとメインウィンドウにメッセージが来たときの処理になってる。
もっと具体的に言うと、
IDCANCEL:IDOK:IDC_RADIO1:IDC_RADIO2:IDC_LIST2:がメインウィンドウへのメッセージとして処理するが、
各イベント処理でやってることは、MyDlgProcの処理になっている、さらにこれらのIDとメインウィンドウのIDが幸いぶつかっていない。
WM_INITDIALOG:が来てもメインウィンドウはすでに立ち上がっているので、おそらく処理しないのだろう。
したがって、この中でやるはずの
hMain = GetParent(hDlg);
はやらないことになるから、当然後ろのInvalidRectする相手hMainは存在しないから、ダイアログボックスのフォーカスも再描画されない。
696 :
訂正:2006/05/08(月) 03:21:14
メインウィンドウのID>WndProcのID
>WM_INITDIALOG:が来てもメインウィンドウはすでに立ち上がっているので、おそらく処理しないのだろう。
IDM_DLG:でダイアログボックスがすでに立ち上がっているので、その後WM_INITDIALOG:が来ても処理しないだろう。
初歩的な質問でもうしわけないですが…。
バッチやWSHなどのスクリプトファイルをEditアクションに関連付けられている
アプリケーションで開くにはどのAPIをつかえばいいんでしょうか?
Editアクションの定義が無かったらエラー報告とします。
よろしくお願いします。
>>698 シェルのなんかでそんな事出来た気が
あれ、Editアクション?シラネ
既存のウィンドウクラスのインスタンスの外観を変える方法はありますか?
また、その方法はサブクラス化ですか?
702 :
688:2006/05/08(月) 10:11:45
>>691〜
>>697さん
ありがとうございます。
ここまで丁寧に説明してもらって
何もお返し出来ないのが残念なくらいです
猫でもわかるwindowsと
W32APIのリファレンス本もみながら勉強してるんですが
猫でもわかるwindowsのソース打っても
なんか、つまらんので、自分なりにソースを作ってる感じです。
本当に、丁寧な説明ありがとうございました。
もっと勉強して、質問にたいして返答できるようにがんばります。
本当にありがとうございました。
>なんか、つまらんので、自分なりにソースを作ってる感じです。
それで、ハマって他人に聞いてたら世話ねーな・・・
SetPixelとBitBltってどっちが早いんですか?
自分敵にはSetPixelとは思いますが、自信が無くて・・・。
計測方法でも良いので教えてください。
同じ回数呼ぶなら、SetPixelの方が早いんじゃない?
10万回SetPixel呼ぶよりは、1回BitBltした方が早いと思うよ
707 :
デフォルトの名無しさん:2006/05/08(月) 12:31:42
おねーちゃんの言うことわかる?
画面サイズ800×600でも、480000回もSetPixel関数呼ぶの。
でも、BitBltなら1回でいいの。
708 :
デフォルトの名無しさん:2006/05/08(月) 12:43:52
>>706 ソース先頭に以下のコードを記述すると、
timeGetTime関数が使えるようになる。
#include <mmsystem.h>
#pragma comment(lib, "winmm.lib")
んで、以下のようにしてmsexを計測すればいいじゃなーい。
(ちなみに一例)
DWORD dwTime;
// 開始時
dwTime = timeGetTime();
/* 計測する処理 */
・
・
// 終了時
dwTime = timeGetTime() - dwTime;
709 :
708:2006/05/08(月) 12:45:19
>>705 目的が違うので、比べる意味がない。
ついでに、測定するならプロファイラ使えよ。
>>706-710 ありがとう!
目的は一応1x1を描画することでした。
それをSetPixelするか、BitBltで1x1をどこかから取ってきて転送するかで迷ったんです。
一応自分でも計ってみましたが、SetPixelよりもBitBltの方が二倍近く遅かったです。
広範囲を書き出すにはBitBltが早かったです(当たり前)
>>705 BCCなのかどうかは知りませんがプロファイラはありませんでした
もしかしてフリーダウンロードとかが出来るようなものですか?
本当にありがとう!
環境はVisual C++ 2005 Express Editon / WindowsXPです。
SetWindowTextをメッセージループの中で回すなどとアホなことしてたので
コメントアウトをしたんですが、コメントアウトをするとメッセージループに入る前に
予め読み込んだテキストファイルの一部が文字化けするという、謎の現象が起きていて困ってます。
メッセージループの中でSetWindowTextを呼んでる限りはそんなことないのですが、
常にウィンドウのタイトルがちらつくようになるのでどうにか修正したいです。
文字コード関係かなとも思うのですが、見当が付きません。。。
他にもアホなことをしてるんだろうと思うが、さすがに検討つかんね
715 :
700:2006/05/08(月) 17:34:54
あげ〜
わかりませんかね?
716 :
712:2006/05/08(月) 17:36:33
うあ!
御礼の後者は
>>710 に宛ててます っていう修正
717 :
デフォルトの名無しさん:2006/05/08(月) 17:47:11
以前ほかで質問したのですが反応がなかったため
フォント名に対応するフォントファイルのファイルパスを取得する方法はありますか?
SHGetSpecialFolderPathでフォルダまでは取得できましたがファイル名がわかりません。
719 :
デフォルトの名無しさん:2006/05/08(月) 18:17:12
>>718 フォントファイル(*.ttf)は[Fonts]ってフォルダにあるけど、
実際はデータ登録式じゃなかった?
AddFontResource, RemoveFontResourceで、
フォントテーブルにフォントデータをインストールして、
GDIとかそこへ問い合わせるんじゃなかったけ?
EnumFont〜はDC問い合わせで、システム問い合わせじゃない訳だし・・・
720 :
デフォルトの名無しさん:2006/05/08(月) 18:21:40
>>718 そこで、フォントファイルヘッダを解析ですよ。
HKLM\Software\Microsoft\Windows NT\CurrentVersion\Fonts
(NT系の場合)
HKLM\Software\Microsoft\Windows\CurrentVersion\Fonts
(9x系の場合)
723 :
デフォルトの名無しさん:2006/05/08(月) 19:10:42
724 :
688:2006/05/08(月) 19:34:19
>>701 rundll32.exe shel32l.dll,shellexecuteXX ....ですかね?
XX ....の部分をもう少し調べてみます。
※おおむね察しがつくと思いますが、既存プログラムのパッチをしようとしています。
ありがとうございました。
726 :
718:2006/05/08(月) 21:03:37
みなさん感謝!!
テーブルの場所さえわかればこっちのもんです
質問させてください。
Windowsでファイルシステムを介さずにバイナリデータをべたで
直接デバイスに書き込むには、普通、どんなふうにするんでしょうか。
例えば、USBメモリに書き込む場合、
Unix系だとデバイスを表すファイルが存在するので、
/dev/sda1
なんかをopenしてwriteしてしまえばよいような気がするのですが、
Windowだとどうなるのでしょうか?
もし、すれ違いでしたらすいませんが誘導してください。
よろしくお願いします。
>>727 MSDNのCreateFile()を隅から隅まで読むことをお勧めする。
取り敢えずディスクであればセクタ単位でアクセスできる。
#それでも直接アクセスできるわけじゃないけどね。
BUTTONやEDITなどのウィンドウの外観を変える方法はあるんですか?
自分的にはサブクラス化してWM_PAINTの部分を頂いていくのかと思ってますが・・・
EDITのWM_PAINTなんか頂いちゃったら、ほぼ全面的に
エディットコントロールを作るハメになるぞ。
>>730 ボタンはオーナードローで良いんじゃないの?
733 :
727:2006/05/09(火) 14:51:45
僕のつたない説明から質問の意図を汲み取ってくださってありがとうございます。
>>728 読んでみました。隅から隅までちゃんと読むべきでした。 orz
呆れずに親切に教えて頂いて本当に感謝します。
>>729 僕にはかなり難しそうな気がするのですが、きっとこれから役に立つのでしょうね。
Bookmarkしておきます。
どうもありがとうございました。
734 :
730:2006/05/09(火) 18:16:08
>>731 あ、そっか。
例にと思って適当に出したけど、出すべきではなかったね。
>>732 あ、そっか。
単純だ。つか忘れてた・・・。
さすがにタブコントロールとかはサブクラス化しかないかな・・・。
>>735 kenyyyyyyyyyyyyyy!!!!
ソースのない、圧縮されたDLLがあります。
このDLLをLoadLibraryしてDllMainが走る前にメモリ上でパッチを当てたいのですが、
どのような方法がありますか?
LoadLibraryExのDONT_RESOLVE_DLL_REFERENCESが近い動作なのですが、
ドキュメントを読んだ感じではインポートテーブルの解決等はしてくれないようなので・・・
739 :
デフォルトの名無しさん:2006/05/10(水) 17:24:13
SetEndOfFile() の逆、つまり、ファイルの始端をずらしたいのですが、
やはり「別ファイルを開いてコピー」という方法をとるしかないのでしょうか?
740 :
デフォルトの名無しさん:2006/05/10(水) 17:37:34
>>739 ReadFile, WriteFileのOVERLAPPEDを利用して、
同ファイルを読みながら書く事もできますが、
失敗や例外時を考えると別ファイルに転送するのが無難だと思います。
741 :
sage:2006/05/10(水) 17:42:55
画像の高さと幅の情報だけを取得したいのですが、
そのような API はありますか
ありません。
ファイルを読み込むAPIだけでいける。
あとはヘッダ部分の調べれば完了。
745 :
デフォルトの名無しさん:2006/05/10(水) 19:11:07
>>741 >>743さんの追記で
BITMAPFILEHEADER構造体,BITMAPCOREHEADER構造体を
ビットマップファイルの先頭部分からReadFile関数で取得するの。
746 :
デフォルトの名無しさん:2006/05/10(水) 20:15:39
アプリの実行者がAdmin権限かUser権限かを判定するにはどうすればいい?
Adminでログインしたユーザにだけ実行を許可するようにしたいんだけど。
「'_tagNN ( *)[16]' 型は '_tagNN *' 型に変換できない」
って警告が出たんだけど、どうすれば回避できる?
(NN*)ってキャストすれば無理やりには出来るんだけど、その後の動作に支障が有りそうだし、
警告を避ける正しいやりかたが知りたいです。
教えてー
とりあえずソース
{
NN* s;
s = new NN[10][10];
delete []s;
}
Admin権限とは、プロセスのユーザがAdministratorsグループに
属していると考えればいいのか?それとも、セキュリティポリシーで
何らかのユーザ権利が割り当てられているものと考えるべきか。
NN*s;を NN (*s)[10];にしろと言われている気がする。
750 :
747:2006/05/10(水) 20:35:00
うあ、ホントだ!
サンクス!
でもなんだこれは?
(NN[10])へのポインタってこと?
勉強不足だなぁ・・・
勉強します。頑張ります。
751 :
デフォルトの名無しさん:2006/05/10(水) 20:38:55
自分はCで関数ゴチャゴチャ作ってたときにそれが出てきた。
>(NN*)ってキャストすれば無理やりには出来るんだけど
この手もあるのか。
2重ポインタで2次元配列を動的に作る時に
どの段階から作るかは難しいなあ
752 :
デフォルトの名無しさん:2006/05/10(水) 21:03:44
>>748 前者です。
ちなみに、NetUserGetLocalGroupsってあるけど、これって
所属しているすべてのグループを取得するんだよね?
あくまで「今」実行したユーザがAdministratorとして実行したか
Userで実行したかを知りたいんだけど。
>>750 typedef NN[10] ArrayNN;とすれば
ArrayNN* s;
s = new ArrayNN[10];
これをtypedefを使わずに書くと
>>749になる。
755 :
747:2006/05/10(水) 22:04:11
>>754 配列までtypedefってできるんだ・・・。
すげーわかりやすいです。どうも。全ての謎が解けました(?)
よく考えたらAPI関係無いじゃんってことでスレ違いですね。注意します。
みなさんくすこ
あるレジストリの値に変化がおきたらコールバックしてくれる。
なんて、そんな仕組みあるもんでしょうか?タイマーで見張るしかないですか?
これってトリビアになりませんか。
よろしくお願いします。
何らかを描画するときって全部WM_PAINTの中でやったほうがいい?
それともWM_PAINTをWindowsから送られるものとほぼ割りきって、要所要所で描画したほうがいい?
それともそれとももしかしてアプリケーションの性質による?
どうか教えて
要所要所でWM_PAINTという考えはないのか
>757
RegNotifyChangeKeyValue
763 :
デフォルトの名無しさん:2006/05/11(木) 06:15:00
c言語でタスクトレイにアイコンを表示したいんですが、
//////////////ソースファイル
NOTIFYICONDATA ic;
HICON hic;
---省略----
hic=LoadIcon(GhInst, "IDA_A");
ic.cbSize=sizeof(NOTIFYICONDATA);
ic.hWnd=HND;
ic.uID=2;
ic.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;
ic.uCallbackMessage=5000;
ic.hIcon=LoadIcon(GhInst, "IDA_A");
strcpy(ic.szTip, "こんにちわ");
Shell_NotifyIcon(NIM_ADD ,&ic);
/////////リソーススクリプト
IDI_AICONDISCARDABLE"Icon1.ico"
↑なぜかアイコンは表示されず、トレイには空白が出現します。
カーソルあてるとツールチップは表示されるんですが、、、
どこが悪いのか教えてくださいませ
764 :
763:2006/05/11(木) 06:17:14
↑リソースのところ、スペースがぬけてますが気にしないでください
リソースの名前が間違ってるんじゃないのか?
766 :
763:2006/05/11(木) 06:44:51
>>765 間違ってました(笑
それで、修正したんですが、それでもなぜか空白になってました。
アイコンハンドルをウィンドウクラスに設定したら、タスクバーには正常にアイコンが表示されるんですがね、、
767 :
763:2006/05/11(木) 08:13:38
すいません、、、
どうやら、リソースの名前が間違っていたのと、インスタンスハンドルをグローバル変数に代入する所で hInst=GhInst と逆に引数に代入していたようです(笑
プログラミング以前に注意力が足りないようです、、、
考えてくれた方、ありがとうございました。
>>760 画面の内容は常にメモリビットマップに持っておく。
RPGでキャラが動いた時とか、すぐ描画したい時、
WM_PAINT以外(WM_KEYDONWとか)で、
まず、そのメモリビットマップに更新部分を描画し、
その後、それをウィンドウに描画する。
WM_PAINTが来た時は、
メモリビットマップをBeginPaintで描画する。
いやゲームとか画像編集(表示)ソフトならそーだろうけどさ。
770 :
760:2006/05/11(木) 15:14:52
>>761 適当なリージョンを指定して描画ってか。
あー、そっか。盲目になってた。
そう言う方法もあるのか。
>>768 とりあえずhdcFlipとかhbmpFlipとかいう感じで似たようなことはやってるが、
WM_PAINT以外でメモリBMPに描画することは考えて無かったよ・・・。
>>769 残念ながらゲームでした。ゲ板行った方が良かったんかな。
どうやら教えてもらった方法で解決しそうです。
それにゲーム作る知識も広がった気がするし。
みんなありがとう!
猫でもわかるプログラミング、
「Windows SDK編 第1部 第85章 MDIでメモ帳もどきを作る その2」
ttp://www.kumei.ne.jp/c_lang/sdk/sdk_85.htm のところを勉強していました。
そしたら、WM_CREATEのところにある、
CreateWindowの最後の引数(LPVOID lpParam)が
「(LPSTR)&ccs」となっていました。
ここのところが、なぜLPSTRにキャストしているのかわかりません。
普通に考えたらLPVOIDにキャストするような気がするのですが・・・
わかる方がおられたら教えてください。
お願いします。
たぶん意味はない。
サイトの管理人に聞けばいいんじゃないかな
774 :
771:2006/05/11(木) 22:06:33
MDIのプログラムを作ろうとして、
コピペでソースを作っていたのですが、
ここは気にせず「(LPVOID)&ccs」にしても問題ないということですよね?
見た目では特に不具合なさそうに見えるので
(LPVOID)にキャストする必要も無いな
776 :
774:2006/05/11(木) 22:29:23
>>775 わざわざ「(LPSTR)&ccs」としているので、
キャストするならどっちかっていうと「(LPVOID)&ccs」ではないのかと思ったのですが、
void型にキャストするのは時間の無駄ですよね。
はっきり言ってどうでもいい
778 :
776:2006/05/11(木) 22:35:06
訂正
誤)void型にキャストするのは時間の無駄ですよね。
正)LPVOID型にキャストするのもやっぱし時間の無駄ですよね。
779 :
778:2006/05/11(木) 22:36:56
>>777 すみません、わざわざ・・・
ですのでとりあえず「&ccs」にしときます。
ありがとうございました。
780 :
760:2006/05/11(木) 23:42:34
型キャストは使い方を誤ると危険です、「出来る限り」使わないようにしましょう。
JavaではそうだったけどCってキャスト無しじゃどうにもならんよね
サンプルもキャストまみれじゃん
まぁWin32APIを使ってるとどうしてもね
Javaもgenerics導入まではダウンキャストしまくってたけど
引数無し関数をいちいち void で宣言してる香具師いる?
ちなみに俺はVOID派
はつみみです
787 :
757:2006/05/12(金) 00:19:36
>>762 ありがとうございました!
やっぱあったんだ…。
788 :
デフォルトの名無しさん:2006/05/12(金) 00:54:28
VC6でmanifestを使ってXP風のUIを作ってて困っているのがタブコントロール
XP風だと上下方向に微妙にグラデーションが掛かってて、単にタブに子ダイアログを
被せると、背景色を似せても完全に溶け込んでくれない
何か定石見たいなものってある?
単にタブのグラデーションと同じ背景色のダイアログが作れれば問題ないんだが
グラデーションのかかったダイアログをわざわざ用意しなきゃいけないの?
つーか、ダイアログの背景にグラデーションを掛けるやり方なんて知らないし・・・・
【情報暴露】
※1時間以内に1万円以上儲からなければ即返金!
(1万円というのはあくまで最低ライン)
★話題の在宅バイトマニュアル★
( 在宅ワーク人気NO.1 )
【参考】
在宅バイトマニュアル ←とネットで検索♪
790 :
デフォルトの名無しさん:2006/05/12(金) 02:43:58
・・・1時間以内に1万円以上儲からなければ即返金って、
1時間で1万円分の仕事が出来なかったら、給料没収ってことじゃんw
>(1万円というのはあくまで最低ライン)
ってのがポイントなのな。
つーか、要は「バイトマニュアル」の販売が目的なんだろ。
793 :
デフォルトの名無しさん:2006/05/12(金) 11:22:15
すみません、ちょっとAPIとか関係ない質問かもしれませんが
データマトリックス方式の二次元バーコードを作るソースはどこで手にはいりますか?
または、どこで聞けばいいでしょうか?
LoadImageでLR_CREATEDIBSECTIONを指定した場合に出来るオブジェクトのbppはなにで決まるんでしょうか?
32bppに固定したいんですができますか?
797 :
デフォルトの名無しさん:2006/05/12(金) 20:44:51
VC++でプログラムしている学生です。
マインスイーパの画面を色を読み取って、
それをプログラムの中で行列にしたいのですが、
どういったコマンドを使えば良いのでしょうか?
・画面の読み取り方
・画像から行列データの変換の仕方など
教えてください。
799 :
デフォルトの名無しさん:2006/05/12(金) 22:43:07
誰とは言わんがトップページを ttp にしてる超馬鹿がいるな・・・
今時直リンがどうのと言うアナクロニズムを超越したシュールな笑いを提供してくれるのはいいが
それは他でやってくれ
800 :
デフォルトの名無しさん :2006/05/12(金) 23:19:26
かなり初歩的な事だと思うのですが質問さしてくださ
例えば,ウィンドウクラス登録で下の関数を使うとして
ATOM 関数名(HINSTANCE hInst)のhInst には WinMainのhCurInstを入れ
ATOM 関数名(HINSTANCE hInst){
WNDCLASSEX wc;
wc.cbSize = (UINT)sizeof(WNDCLASSEX);
・
・
wc.hInstance = hInst;
・
・
return (RegisterClassEx(&wc));
}
で、RegisterClassEx()の戻り値がATOMなので
分かるのですが、他にも自作関数でATOMを使う
場合があるのでしょうか
ヘッダを見ると
typedef unsigned short WORD;
typedef WORD ATOM;
となってますが、利点というか、この時にATOM型を使う
という区別は、返す値の型に依存することになるのでしょうか
あと、ATOM型で変数を宣言するなんて事はあるんでしょうか
HICON型やHCURSOR型や(HBRUSH型などは
なんとなく理解できてるつもりですが、ATOM型に関しては
わからないけど使ってるという状態で
どなたか説明して頂けないでしょうか。
お願いします。
Shell_NotifyIconについてなんですが
http://yokohama.cool.ne.jp/chokuto/urawaza/api/Shell_NotifyIcon.html 第1引数の dwMessage で、NIM_SETFOCUS の解説のところ。
>タスクバー通知エリアにフォーカスを返します。タスクバーアイコンは、
>ユーザーインターフェース操作が完了したときにこのメッセージを送るべきです。
>例えば、タスクバーアイコンにショートカットメニューを表示して、ユーザーが
>ESC キーを押してキャンセルしたときに、このメッセージを送信してフォーカスを
>タスクバー通知エリアに返すべきです。
このあたりがどうもよくわかりません。どんなタイミングでこれを発行すべきなのか・・・?
>>800 ATOMはどちらかというとローカルアトム・グローバルアトムでお世話になる。
RegisterClass(Ex)などが返すクラスアトムとは混用できないので注意。
そういう事じゃなくて・・・
アセンブラでプログラミングした場合に、
1. システムが何か使えるパラメータを積んでくれているのかどうか
2. ExitProcessでなくretした場合にret 4とかret 8とかでなくretでいいのかどうか
という事です。
ちなみにレスが遅いのはアク禁で代行してもらってるからです。なのですぐにレス書けないですがよろしくお願いします。
入門書で勉強する
サンプルプログラムを参考にする
それでわからなかったら検索する
それでもわからなかったら掲示板で質問する
>>803 AdvancedWindowsに書いてあるが、
Windowsはエントリポイントを引数なしで呼んでいる。
だから、何も積まれていないしretで良い。
>>799 いちいち気にするオマエの方がどうかと思うが・・
気になるなら専ブラ使うなり、フィルタ掛けるなりしろよ。
それよりも関係ないことでageるな。
807 :
デフォルトの名無しさん:2006/05/13(土) 15:30:06
>>806 ageかどうかこそ関係あるまい
直リンと同レベルの都市伝説かっこわりー
わからないなら無理しなくていいぞ
「よくわからないが名前欄に"sage"て書いて置こう」
と覚えておこう!
いやきっと、sage不要教条主義なんだよ。
810 :
デフォルトの名無しさん:2006/05/13(土) 19:16:06
unixみたいにrootでパスワードなしに任意のユーザにsuしたいのですが
該当するAPIはありませんか?
Administratorから「パスワード無しでパスのついてある任意のユーザにsu」なら不可能。
無理すか。不便だ。
つーか、Windowsそれ自体だって、たとえば、
サービスをLocalSystem以外の権限で動かすには、
ユーザ名とパスワードの入力が要る。
(サービスのログオン設定)
814 :
デフォルトの名無しさん:2006/05/13(土) 20:13:13
LV.1 クラッカーが経験値稼ぎ中か・・・初々しくていいねw
815 :
・∀・)っ-○◎● ◆toBASh.... :2006/05/13(土) 20:13:45
816 :
デフォルトの名無しさん:2006/05/13(土) 20:20:25
>>506 さあね、捨て値で叩き売りしてたやつ・・・ ぱっと見、109かな? それだけ
スペースが左に寄りすぎてなくて電源キーがあればとりあえず何でもいい
@が2のところにあるのでも特に違和感はないし
>>506 英語キーボードのiBook。
Macは英語配列の方がキーバインド上使いやすい。
すれ違い
819 :
796:2006/05/13(土) 23:56:51
>>797 CreateBitmapなどで32bppのを作って、いったんLoadImageしたのを入れればどうかってこと?
LoadImageで読み込んだ時点で16bppや24bppだとデータの劣化があるわけで
そのあとでいくら32bppに変換しても元のデータと違うのでまずいのですよ。
それなのでLoadImageの時点で確実に32bppで読めるようにできないのか聞きました。
820 :
796:2006/05/13(土) 23:58:30
×16bppや24bppだと
○16bppだと
>>819 心配しなくてもソース側 BITMAPFILE の BPP で読まれます。
MAKEPOINTSがあってMAKEPOINTがないことに疑問を持ち
とりあえず作ってみようと思いますた。
とりあえずマクロで、
#define MAKEPOINT(lParam) ((POINT){((lParam & 65535),(lParam >> 16)}))
としました。
しかし・・・
式の構文エラーと出ます。
INT型などの場合は#define aa(i) ((INT)i)などは出来ます。
構造体でこういったことをするにはどうしたらいいのでしょうか?
>>822 マクロではそれは難しいです。やめた方が良いでしょう。
C++ なら inline 関数でほぼ同じことができるので、そちらを使いましょう。
>>823 えっ?
そんなに難しい」のですか?
これのために色々考えてたのですが・・・
それではアドレスが指す場所に直で計算した数値を無理やり突っ込むのはどうでしょうか?
そういうのは無理でしょうか?(そういや環境によって構造体サイズが違うのか・・・)
>>824 inline関数のことでしょうか?
それにしても、Cで使えるようになっっていたのですね
gccしかないものだと・・・
827 :
デフォルトの名無しさん:2006/05/14(日) 02:29:26
建前、Win32API は C でいいことになってるけど、
現実問題としてやっぱ C++ でないときついことが多いな
>>827 そうですね、そろそろ私もC++もするべきかなって思ってます。
やっぱしStringがないのが一番堪える!
829 :
デフォルトの名無しさん:2006/05/14(日) 03:39:22
CString は MFC でも今や忌み子だけどな
このスレは週末も連休も関係無くスレが伸びているな。
関心関心。
FindWindowで得られたウィンドウハンドルを使って、そのプロセスのハンドルを取得
することってできますか?
>>831 GetWindowThreadProcessIDとOpenProcessを組み合わせればいいと思う。
833 :
831:2006/05/14(日) 12:49:49
>>831-833 Vista だと UIPI 関係で失敗する場合があるんじゃなかったっけ?
自分よりも相手の権限のほうが上位だった場合に。
突然、Vistaの話に飛んだね。
WinXP SP2のIEで、ダウンロードが自動的に始まるページへ移動すると
"セキュリティ保護のため・・・"
と表示され、自動的にダウンロードが行われないようになっていますが、
IWebBrowserを使用したIEコンポーネントで同じような機能を実装するには
どうすれば良いのでしょうか?
よろしくお願いします。
>>835 すまんね。Vista で動かすつもりがないんならいいんだけどさ・・・
>>834 エラー処理をきちんと組んで突然落ちたりしなければ、大抵それで十分だと思う。
98とVistaは何が違うんですか
842 :
デフォルトの名無しさん:2006/05/15(月) 10:53:32
IPアドレスを指定してNetBIOS名を取得するようなWin32APIって、ご存じないですか?
どなたかご教授願います。
よろしくお願いします。
843 :
デフォルトの名無しさん:2006/05/15(月) 11:32:59
>>842 WinSock系でgethostbyaddr関数。
844 :
デフォルトの名無しさん:2006/05/15(月) 15:38:41
モデム着信を検出し、そのまま、PPP 接続させたいのです。
AT コマンドの ATA でオンフックさせればよいのかなと思うのですが…。
RasDial の電話番号指定を "A" だけにすればよろしいのでしょうか?
ご存知の方、ご教授お願いいたします。
845 :
デフォルトの名無しさん:2006/05/15(月) 15:48:43
【質問内容】
NICとNICに設定しているDNSサーバの関係付けを知るためのAPIって有りませんか?
【やりたいこと】
NICの設定をする「インターネットプロトコル(TCP/IP)のプロパティ」みたいな
ダイアログボックスを作りたい。
【ひっかかっている点】
NICとNICに設定しているIPアドレスetcの関係付けはGetAdaptersInfo()で
知ることができるのは理解しています。
DNSサーバを知る手段にGetNetworkParams()が有ることも理解しています。
しかしこの2つのAPIだけでは、NICが複数枚あった場合にどのNICと
どのDNSとが関係しているのかが不明なので、ここでの質問に及んだというわけです。
よろしくおながいします。
846 :
デフォルトの名無しさん:2006/05/15(月) 18:27:13
二次元バーコードでデータマトリックス方式のソースを公開してるURLを教えてください
WIN32APIと関係ない。
>845
なんでNICとDNSが関連付くんだ?単にWindowsの標準設定ダイアログが
そうなってるだけだろ?
849 :
845:2006/05/15(月) 20:20:50
>>848 そういえば、そうですね(^^;)。設定のダイアログと同じようなものを作ろうとしてたので
NICとDNSの設定が対になっていると思い込んでました。
確かにFreeBSDなんかNICとIPアドレスの設定は/etc/rc.confにして
DNSの設定は/etc/resolv.confにするもんなぁ…
ありがとうございました。
850 :
デフォルトの名無しさん:2006/05/15(月) 20:38:06
>>849 わんわんわん、わん
(それでも納得いかないなら)
わんわわんわん、わんわわんわんわん わんわんわん
(WMIのWin32_NetworkAdapter,Win32_NetworkAdapterConfigurationで情報を取得するってのがある)
わんわん
流行ってそうだから
俺もわん。
デフォルトゲートウェイはNICごとですよね?
わんわわん
うわあん
デフォルトゲートウエイもその定義からして、
PCに1つあれば十分
>>841 > (たとえばGetXXX()はできるが、SetXXX()はできない、などと考えていいのかな。)
ああ、なるほど。じゃあ、FindWindow くらいなら問題ないのかな。
…と思ったらそのブログには要注意 API として挙げられてるなあ。
わけわからん。
> まあ、下位互換性を考慮して、抜け道を用意するんだろうけど。
> 少なくともユーザが権限を指定できるはず。
XP のときのように個々のアプリごとに互換性ダイアログが用意されている。
問題が起きたらこれを使って権限を上げとけ、ということらしい。
>>850-854 ∧__∧
/ - - \
| ▼ |
/|=(_人_)= | < 日本語でおk
/ ヽ、____ノ
`Jr ___ ノ
∪⌒∪ ∪
NT4.0でSE_TCB_NAME特権をゲットする方法誰か知りませんか?
LogonUser()を使いたいんでう。
流行ってそうだから
俺もでう。
GetCurrentProcessId() ってDWORDを返すようですが、
実際に使われるプロセスIDの範囲って決まってたりするんでしょうか?
いかなる仮定も置くべきではないことは確かだな。
863 :
デフォルトの名無しさん :2006/05/16(火) 09:23:33
すいませんくずたれな質問さして下さい
スクリーンセーバーを猫の本みながら作ってたんですがリンカでエラー
がでてしまいます。
どうすれば良いのでしょうか。教えて下さい。
#include <windows.h>
#include <scrnsave.h>
#include "resource.h"
#pragma comment(lib, "scrnsave.lib")
#pragma comment(lib, "comctl32.lib")
#define ID_TIME 100
LRESULT WINAPI ScreenSaverProcW(HWND hWnd, UINT msg,WPARAM wParam, LPARAM lParam)
{
・
・
・
return DefScreenSaverProc(hWnd, msg, wParam, lParam);
}
BOOL WINAPI ScreenSaverConfigureDialog(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
return TRUE;
}
BOOL WINAPI RegisterDialogClasses(HANDLE hInst)
{
return TRUE;
}
のようなソースで
scrnsave.lib(scrnsave.obj) : error LNK2019: 未解決の外部シンボル _ScreenSaverProc@16 が関数
_RealScreenSaverProc@16 で参照されました
となります。
何が足りないのかわからないです。すいませんが、教えて下さい
>>863 よくわからんけどなんでScreenSaverProcWってWついてんの?
865 :
デフォルトの名無しさん:2006/05/16(火) 09:43:11
あなたのソースをコピペして実行してみた結果です。
ss.cpp
リンク中...
scrnsave.lib(scrnsave.obj) : error LNK2001: 外部シンボル "_ScreenSaverProc@16" は未解決です
Release/ss.exe : fatal error LNK1120: 外部参照 1 が未解決です。
link.exe の実行エラー
ss.exe - エラー 2、警告 0
>>864 scrnsave.h 見た。
実体は UNICODE で分岐してるね ScreenSaverProc/ScreenSaverProcW
# コード記述時は UNICODE に関わらず ScreenSaverProc を要求しているようだけど
RealScreenSaverProc()はどこにある?
#define UNICODE
//#pragma comment(lib, "scrnsave.lib")
#pragma comment(lib, "scrnsavw.lib")
通った
#define UNICODE
は
#include <windows.h>
#include <scrnsave.h>
より前に必要
/D でも可?
#define UNICODE
#include <windows.h>
#include <scrnsave.h>
#include "resource.h"
#pragma comment(lib, "scrnsavw.lib")
#pragma comment(lib, "comctl32.lib")
#define ID_TIME 100
LRESULT WINAPI ScreenSaverProcW(HWND hWnd, UINT msg,WPARAM wParam, LPARAM lParam)
{
・
・
・
return DefScreenSaverProc(hWnd, msg, wParam, lParam);
}
BOOL WINAPI ScreenSaverConfigureDialog(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
return TRUE;
}
BOOL WINAPI RegisterDialogClasses(HANDLE hInst)
{
return TRUE;
}
これでFA?
872 :
863:2006/05/16(火) 12:12:48
VS2005std
でUNICODEでビルドしてるので
>>869さんの
#pragma comment(lib, "scrnsavw.lib") ←
#pragma comment(lib, "comctl32.lib")
でいけました
ありがとうございました
他にもwになってるのがおおいのかな
873 :
デフォルトの名無しさん:2006/05/16(火) 12:14:55
あっ、そうそう、ワイド文字を使いたい場合は
#define UNICODE
#define _UNICODE
と2つ書くのでおk?
>>872 >VS2005std
>でUNICODEでビルドしてるので
それを最初に書かんかいゴルア
少し質問させてください。
キーボードフックしてあるアプリケーションに別のアプリケーションから、
PostMessageでWM_KEYDOWN/UPを投げてもフックプロージャが呼ばれません。
これをどうにかする良い知恵ありませんか?
↑ X:プロージャ O:プロシージャ
そんな突っ込みはいりまsんしんでください
↑ X:いりまsん O:いりません
880 :
デフォルトの名無しさん:2006/05/16(火) 16:47:53
他のプロセスのウィンドウにキーメッセージを送りたいんですけど、いろいろ試しても成功しません。
どなたかご教授ください。
↓のようなc言語ソースなんですが、どこが悪いんでしょうか?
WINHND=FindWindow(NULL,"メモ張");
PostMessageA(WINHND,WM_RBUTTONDOWN ,0,0x012C012C);
PostMessageA(WINHND,WM_RBUTTONUP,0,0x012C012C);
正常ならメモ張の300x300の所に右クリメニューが出るはずなんですが・・
Windowsについてくる、メモ帳にメッセージ送ろうとしてるわけではないよね?
>>881 >Windowsについてくる、メモ帳にメッセージ送ろうとしてるわけではないよね?
そうです。無理なんですか?
無理だとしたら、メモ張だから(windowsについて来るアプリだから)という事ですかね?
883 :
880:2006/05/16(火) 17:10:02
>>882も私です。
そもそも、同じプロセス内でしかメッセージって送れないんでしょうか?
んなことはない。
880のコードではメモ帳の親ウィンドウにメッセージを送っているが、
エディタ部分(おそらく標準のエディットコントロール)の方に送ってやらないとダメなんじゃないか。
あとさぁ
×メモ張
○メモ帳
HWND hNotepad, hEdit;
hNotepad = FindWindow("Notepad", NULL);
hEdit = FindWindowEx(hNotepad, NULL, "Edit", NULL);
PostMessageA(hEdit, WM_RBUTTONDOWN ,0, 0x012C012C);
PostMessageA(hEdit, WM_RBUTTONUP, 0, 0x012C012C);
>>884 SPY++ でみた。
エディタ部分は標準のEDITコントロールだーね(サブクラス化されてるかはワカランけど)
例のソースに入ってた
889 :
880:2006/05/16(火) 18:15:18
できました!ありがとうございます。
なるほど。表示されてるウィンドウに送ればいいってもんじゃないんですね。
サブクラス化について質問があります。
typedef struct 構造体
{
WNDPROC fnSubProc;//親のプロシージャ
・・・
}構造体;
と前もってこの構造体を作っていました。
サブクラス化したときの戻り値である親ウィンドウのアドレスを
構造体 *a;
a = (構造体*)malloc(sizeof(構造体));
SetWindowLong(hWnd,GWL_USERDATA,a);
a->fnSubProc = (WNDPROC)SetWindowLong(hWnd,GWL_WNDPROC,(LONG)SubProc);
といったふうにこの構造体内に入れました。
そして領域の開放は、SubProc内のWM_DESTROYにて、
構造体 *b;
b = (MYDATA *)GetWindowLong(hWnd,GWL_USERDATA);
free(b);
return 0;
と開放処理を入れました。
これでとりあえずは動いていました・・・、終了処理以外。
エラーの原因は、WM_DESTROYした後にもSubProcが来ていて、
既に消した構造体を参照しようとしているからだと思うのですが
WM_DESTROY以降に来るメッセージがわかりません。
それにこの方法自体してはいけないのかもわかりません。
長くなりましたが、どなたか教えてもらえないでしょうか。
>>890 最後に来るメッセージは WM_NCDESTROY 。
ドキュメントのどっかに載ってます。
あと将来のことも考えて、
LongPtr とか GetWindowLongPtr の使用も考えてください。
>>891 はやい書き込み、ありがとうございます。
WM_DESTROYをWM_NCDESTROYに変えたらエラーが出ませんでした。
ほんとうにありがとうございました。
質問です。
LPCWSTRでも使えるWriteFileみたいな関数はないでしょうか?
WriteFileで使えるだろ。
一瞬WriteFileW()が浮かんでしまった漏れがいる…orz
Writeした結果がどうなって欲しいのかわかんないと、どうにも。
猫でものプログラムをUNICODEバージョンに変えようと思いました。
http://www.kumei.ne.jp/c_lang/sdk/sdk_00.htm←このプログラム
ですので、
そのプログラムの先頭に
#define UNICODE
#define _UNICODE
をつけ、
「char szClassNme[] = "ウィンドウクラス・ネーム";」などを
「LPCTSTR szClassNme = TEXT("ウィンドウクラス・ネーム");」
に変更して実行しました。
ですが結果なのですが
if (!RegisterClass(&myProg)) return FALSE;
のところで処理を抜けているみたいです(MessageBoxで確認)。
なにがだめ駄目だったのかわかりません。
どなたか教えてもらえないでしょうか?
普通に動くサンプルを元にした方がいい。
動かないものを動くようにするのは初心者には無理
900 :
デフォルトの名無しさん:2006/05/17(水) 12:06:47
VisualSutdioのウィーザードでアプリを作ると素っ気ないアプリが出来てしまうんですけど、
できれば、Picasa2みたいなイカス外観とか、スキンのような仕組みを取り入れないんですけど、
フレームワークのような物があるんでしょうか?
何か情報ありましたら教えてください、よろしくお願いします。
>>892 後始末なら サブクラス化前の WNDPROC を書き戻した方が良くないかい?
902 :
897:2006/05/17(水) 14:17:53
>>898 UNICODEにしたらメッセージボックスの文字列がおかしくなっていました。
ですのでわかりませんでした。
>>899 UNICODEでなかったら動きました。
>>897 プログラムの先頭って、具体的にどこ?
ヘッダファイルの宣言より上だよね?
>>902 OS が Windows 98 とか ME なんじゃないでしょうか。
>>903 ヘッダファイルより下だと、ANSIに切り替わるだけじゃない?
>>905 ANSIコードにしときならが、pragma で WIDE側 lib 連結してたら ワケワカ状態になる可能性が
907 :
903:2006/05/17(水) 14:41:08
>>906 WinAPIはdefineで切り替えてるから問題なくね?
>>908 あ API は シンボル名 違うから、衝突なんておきないか。
# 元質問のリンカエラーがそうだったし
>>902 どういう環境で書いてるのかシランが、
デバッガの使い方を覚えるか、デバッガを使える環境に移行することを勧める
喪前らこんな20行程度のコードも机上デバグできないのかよ・・・ビクリしますた。
帰ってきたエラーコードは 0x00000078 、原因は 897 が WIndows98/ME/95を
使っているから。以上でオシマイ。
912 :
897:2006/05/17(水) 15:02:28
>>903 ヘッダファイルの宣言より上です。
>>904 もしかして98系だと無理なのですか?
今、諸都合により98系です。
>>911 すまねぇ SDK見りゃ一発だわな
RegisterClass
Unicode: Implemented as Unicode and ANSI versions on Windows NT/2000.
914 :
897:2006/05/17(水) 15:16:20
>>904,911,913
すんません、自分がばかでした。
XPばかりだったので忘れてたみたいです。
つきあってくれてありがとうございました。
>>914 Microsoft Layer for Unicodeを使えば9xでも一応Unicode版APIが使える。
ツールバー(BTNS_CHECKのボタンがあるもの)にて
ツールバーのチェック状態を得るにはどうしたらいいのでしょうか?
TB_GETSTATE
ウニコードとか意味不明だぜ
釣りだろ
ウニコードも知らんのか
僕の肛門もウニコードに置き換えられそうです。
922 :
872:2006/05/18(木) 02:38:32
>>874さん
すんません
>>897さん
猫でもの本を買った俺からの意見
「なんでこんなにグローバルで変数宣言してんだ」
「なんで、こんなに変数を初期化せずに使ってるんだ」
「この変数は関数内だからグローバルじゃなくてstaticで関数内で宣言すれば良いじゃねぇか」
「なんで、こんなにAPIについて説明が中途半端なんだ」
「おいおい、このAPIについての説明はこれだけ?」
「初心者の俺みたいな奴に、EnableMenuItem()を初めて説明するときに
フラグをMF_BYCOMMANDで指定させるか?」
「リソースの名前を""で囲めば楽ですよ、ってMAKEINTERESOURCE()使った方がもっと楽じゃねーかよ」
「なんで、毎回ウィンドウクラスの登録とCreateWindowするとこだけは律儀に
書いてんだよ、で、前の章では使ってない関数とかをなんで太字にしたりしなかったり」
「この変数どこで宣言してんだよ・・・・あ、またグローバルで宣言してるよ」
「あれ、本通り打ち込んだのに動かない、あれこの関数宣言してるのに使ってない
・・・って、急に別ページにのこりの関数書くなよ」
「ライブラリを#pragma command(lib, "〜")する仕方の説明なしかよ(この板で
教えてもらったよ)」
「別に拡張子で判断されないのは分かるけど、せめて.cppはやめようよ」
「なんだか、この本のプログラムの書き方を身につけて良いのだろうか・・・・」
と、いう過程によりくずたれな俺がリファレンス本を買いプログラムの書き方について
考えさせられ、自発的に向上をうながしてくれる良い本だよ。
一度買ってみると良い。だんだんいらついてくるきてやる気薄れてくるから。
ただ、俺は一応全部UNICODE変えて書いてて
世の流れもそうなっていくらしいからそうしてるけど、ANSIの方が良いのかな
くずたれの俺にはわからない。
>>922 NTカーネルの内部は、すべてUTF-16になっている。
いまのANSI版のAPIは、すべてWide版のラッパに過ぎない。
当然、ANSI版のAPIを使うと、文字コード変換のオーバーヘッドが生じる。
MSもUNICODEに移行したがっているけど、過去との互換性の問題で、なかなかうまくいかない。
今までに書かれ、今もなお動いているコードが多すぎるから。
やっと、VCから、デフォルトの文字コードがUNICODEになったけどね。
本格的に移行するには、あと5年から10年はかかるのかな。
>>922 「猫でも〜」はWebで全部見られるから本買う気が起きない
webのやつがそのまま本になったわけじゃないだろうけど
書いた本人は同じだからな
猫でもにはいろいろ(今となっては)不満もあるが、10年前にはあれほどには
まとまったものはなかった。オレには有り難かった。昔はメールで聞くと教えて
くれた。あれを最新版にするため見直すってのは、マ大変だな。
世話になって感謝の気があるならたまにアクセスしてアクセス回数を増やして
礼の代わりにしたがいい。いずれは陳腐化して消えるだろうが、出来るだけ
残ってほしいと思う。
感謝する気があるのなら、寧ろ早く消えてもらって次の誰かの登場を期待すべくアクセスしない方が医院で内科医。
猫だけで勉強するのは絶対不可能
初心者の場合は特にそう
ただサンプルがいっぱいあるから使える。
929 :
900ですが、:2006/05/18(木) 12:16:36
ここじゃレス付きそうもないですかね?
何方かスレ紹介してくれませんでしょうか?
猫はAPIのサンプルだろ。
931 :
デフォルトの名無しさん:2006/05/18(木) 14:36:17
子ウィンドウの数を調べるにはGetWindowでループさせるくらいしかないですか?
せめて EnumChildWindows 使えよ
VisualStudioなどのForm作成画面について質問です。
あのForm作成画面で作成されるボタンとかはCreateWindowで作ったボタンに、
フォーカスが移動したとき、
そのボタンの上にサイズ変更の枠の形をしたWindowを重ねるという処理して実現させているのでしょうか?
違います
それでは、ボタンっぽい自作ウィンドウですか?
違います
SPY とかで見たら?
SPY?
それはなんなのでしょうか?
作り方わかんない・・・
わかんないなら作らなくていいですよ?
>>939 コントロールじゃないんだからspy++で見ても意味無いだろ
>>935 DrawFrameControl()とか使って自前で描画してください
いちおうspy++で見たら
VC6のはそのまんま実物だな
あとは知らん
>>942 そんなのがあったんだ・・・
この関数の内容を見たら
ボタン、タイトルバー、メニュー、スクロ−ルバー
しか出来ないみたいですが
EDITやSTATICは自分で書くしかないのですか?
わかんないなら作らなくていいですよ?
DrawTextで文字を表示させようと思ったのですが
背景が白くなってしまいます。
背景を白く塗らなくするにはどうしたらいいのでしょうか?
947 :
946:2006/05/19(金) 02:48:01
事故解決しました。
SetBkMode(hdc,TRANSPARENT);
がんがれ
950 :
デフォルトの名無しさん:2006/05/19(金) 11:32:55
DrawFrameControlなのですが
ラジオボタンやチェックボックスは、
ボタンの位置やサイズ、テキストの位置は自分で計算するしかないのでしょうか?
>>952 DrawFrameControl は現状殆ど使い物にならないからやめた方がいいよ。
本物のコントロールを配置して、手前をWS_EX_TRANSPARENTなウィンドウで
覆っておくのがお勧め(何か上書きしたいならそのウィンドウで)。
>>953 やっぱしそうですか・・・。
「ボタンだけならどうにかなるけどチェックボックスとかはどうするのこれ?」って
結構迷いました・・・
というわけど教えてもらった方法を考えてみたいと思います
だれだ DrawFrameControl を薦めた香具師は
>やっぱしそうですか・・・。
最初から自分で作ればいいんじゃないか
>>956 まぁ、そうでしょうけど作るのがしんどいだろうし(自分のレベルじゃ)
できたとしても違うものが出来そうなので・・・
埋めようぜ
乙女座の聖闘士は、
自分の写真と某アニメのロリキャラとの合成プリントシャツ着たキモオタデブ
なんでもいいので埋めてください。
SuspendThread
ExitThread
とりあえず
>>960を埋めました
、、、、
_彡_, ,_ヾ
/∩|;`"皿`"|) =3
くヘ | ̄ヽL| |」 ]つ ┐
|j、__| |_| ┰'’
|__|_| _||_ (○)
|__)_) | ∪ | |/)
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
⊂⌒~⊃。Д。)⊃
FreeLibraryAndExitThread
CreateWindowは存在しない!
_onexit( exit_func );
...
int exit_func()
{
BUTTONウィンドウの背景色を
灰色じゃない色(例えば、赤)に変えるにはどうしたらいいのでしょうか?
2つのPOINT構造体からRECT構造体を返す関数はないでしょうか?
>>968 それくらい自分で作れ。
そういえばMFC/ATLのCRectにはPOINTとSIZEを受け取るコンストラクタがあった気がする。
>>969 そういう関数が最初からあるんだったら
そちらを使ったほうがいいかなと思ったのでとりあえず・・・
ないのでしたら自作します。
RaiseException(
0
, dwExceptionFlags //復帰不可能
, 0, NULL ) ;
972 :
971:2006/05/19(金) 22:51:48
__except(EXCEPTION_EXECUTE_HANDLER) { /*typo*/ }
//素で間違えたOrz
いいこと思いついた
お前らこのスレを埋めろ
よっし、お前が埋めろ
namespace foo {
class RECT
{
::RECT rect ;
public :
RECT(::POINT left_top, ::POINT right_bottom)
{
rect.left = left_top.x ; rect.top = left_top.y ;
rect.right = right_bottom.x ; rect.bottom = right_bottom.y ;
}
operator ::RECT() { return rect ; }
} ;
} //namespace foo
うーん、激しく車輪の再発明な気がしないでもない。
RECT のポインタを渡して中身を書き換えたときに
元の POINT の中身も換わって欲しかったりすることない?
よくわからないが、CRectをコピれば終わらないか?
ソースみたけどやっぱりコピってるんだね
SetRect
981 :
976:2006/05/20(土) 13:13:28
>>979 いや、そのヘッダは読んでいないけど、誰が書いても同じものになると思う。
コピってるっていう意味は元のPOINTの
インスタンスにデータをコピーしてるってことです
ごめん文章がおかしくなった
コピってるっていう意味は元のPOINTのデータを
RECTのインスタンスにコピーしてるってことです
afxwin1.inl というインライン定義記述用ソースファイルの中に
// CRect
_AFXWIN_INLINE CRect::CRect()
{ /* random filled */ }
_AFXWIN_INLINE CRect::CRect(int l, int t, int r, int b)
{ left = l; top = t; right = r; bottom = b; }
_AFXWIN_INLINE CRect::CRect(const RECT& srcRect)
{ ::CopyRect(this, &srcRect); }
・・・
こういうのが延々と続いていました
985 :
976:2006/05/20(土) 13:48:09
>>982 ここで、POINT構造体のラッパも用意してみる。
処理は全部、全部クラス内に記述する。
RECT rect = foo::RECT(foo:POINT(0, 0), foo::POINT(640, 480)) ;
賢いコンパイラなら、インライン展開したほうが得であると考えて、
インライン展開->さらに最適化->普通のRECT構造体に値を設定した場合と、なんら変わらない処理に。
というかコピーとかいうのは、どういう意味で使っているのだろう。
986 :
976:2006/05/20(土) 13:49:37
あ、POINT構造体とか言っている時点で、そもそも上の例は間違っているか。
普通のRECTなら、
RECT rect = {0, 0, 640, 480} ;
でいいか。
MFC使おうよ
>>985 わかりにくくてすみません
POINT p1 = { 5, 7 };
POINT p2 = { 13, 31 };
RECT r = hoge(p1, p2);
ここまではみなさんの考えてることと同じなのですが、
r.lefttop.x = 3;
としたときに、もとの
p1.x も 3 になってほしいのです
struct HOGE
間違えたorz
struct HOGE
{
POINT lefttop ;
POINT rightbottom ;
} ;
こんな感じかな。
こんなあほみたいなテクニックを使う、
わかりにくいコードなんて、読みたくないが。
それじゃだめでしょ
>>991 オーケー
>>988を読み直した。
コンストラクタでp1,p2の参照を取って、メンバに保持しておき、
RECTフェイクなクラスが変更されたら、参照も変更する。
ますます読みたくないコードだ。
埋めようよ
埋めてしまえ
梅
もったいないスレの使い方を・・・
いいじゃんいままでそうやって埋めてきたんだし
1000だったらVistaで新API UninstallWindowsVista導入
1000
1001 :
1001:
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。