くだすれVisual C++(超初心者用)その3
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/06/12(月) 18:48:32もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。
Visual C++使いが優しくコメントを返しますが、
お礼はVisual C++の布教と初心者の救済をお願いします。
■過去スレ
前スレ
http://pc8.2ch.net/test/read.cgi/tech/1141087248/
前々スレ
http://pc8.2ch.net/test/read.cgi/tech/1135817069
■遠い親戚スレ
くだすれC++/CLI(初心者用)
http://pc8.2ch.net/test/read.cgi/tech/1142144110/l50
■関連ページ
Visual C++ Home Page
http://www.microsoft.com/japan/msdn/visualc/
0002デフォルトの名無しさん
2006/06/12(月) 22:59:30Visual C++ Proffesional EditionでC++のプロジェクトでコーディングをしているのですが、
急にデバッグする時、ブレークポイントにきちんと停止してくれなくなってしまいました。
ブレークポイントは現在の設定ではヒットしません。ソースコードが元のバージョンと異なります。
と言われます。
ググってみると
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/vsdebug/html/vxtskDebuggingClassLibraries.asp
の
デバッグをどの方法で始める場合でも、クラス ライブラリのデバッグ バージョンを先にビルドして、
アプリケーションが参照する場所にデバッグバージョンを配置するようにします。
この手順を忘れると、アプリケーションが別のバージョンのクラスライブラリを参照して読み込む可能性があります。
その場合、プログラムは実行を続け、設定されたブレークポイントにヒットしません。
という記述が関連していそうな気がするのですが、よく意味がわかりません。
分かる方、アドバイスお願いします。
0003デフォルトの名無しさん
2006/06/12(月) 23:07:09乙
0004デフォルトの名無しさん
2006/06/13(火) 01:56:07関数でCStringのポインタを使って、直接文字列をいじりたいんですけど、
それをやろうとしてもエラーが出たりします。本を見たりネットを見たりして
色々と試したんですが、どれもうまくいきません。
char型のように関数で文字列を直接扱うことはできるんでしょうか?
0005デフォルトの名無しさん
2006/06/13(火) 02:02:49できるよ
どう扱うのかわからんからサンプルくれ
あと、
CString str;
strcpy( &str, "hoge" );
とかはするなよ!絶対!!
0006デフォルトの名無しさん
2006/06/13(火) 02:31:35for(int i = 0; pattern[i] != NULL; i++){
if(index = text[i] - pattern[i] != 0) break;
}return index;}
char* Strstr(char* text, char* pattern, int len, int n){
char* end = text + len - n + 1;
while(text != end){
if(Strcmp(text, pattern) == 0) return text;
text++; } return NULL;}
void table(char* pattern, int* TABLE){
int x = 1, y = 0; TABLE[0] = 0;
while(pattern[x] != NULL){
if(pattern[x] == pattern[y]) TABLE[x++] = ++y;
else{ if(y == 0)TABLE[x++] = y;
elsey = TABLE[y];}}
char* bmp(char* text, char* pattern, int len, int n){
int y = 0; int* TABLE = new int[strlen(pattern)];
table(pattern, TABLE);
while(*text != NULL){
if(*text == pattern[y]){text++;
if(pattern[++y] == NULL)return text - n;
}else{ if(y == 0)text++;
elsey = TABLE[y - 1];
} } return NULL; }
void main(){
char a[] = "fhsoeriojtotetototo"; char b[] = "totetototo"; char* c; char* d;
int len = strlen(a); int n = strlen(b);
c = Strstr(a, b, len, n);//単純法 d = bmp(a, b, len, n);//KMP法}
こんな感じで、charのところをCStringを使って扱いたいわけです。
0008デフォルトの名無しさん
2006/06/13(火) 07:11:46それは止めたほうがいいよ。引数の char* を const char* にすれば CString を
(暗黙のキャストで)渡せるようになるから、それくらいで満足しておくべき。
UNICODE でもOKにするなら const TCHAR * で。
0009デフォルトの名無しさん
2006/06/13(火) 08:18:02教えてください。携帯からですみません。
0010デフォルトの名無しさん
2006/06/13(火) 10:57:53自分で計算して描画 or DirectXを使う
0011デフォルトの名無しさん
2006/06/13(火) 13:51:44つまり、const char* 以外の方法は無いって事でしょうか?
CStringで文字列を格納して、関数で受けるときはcharを使った方が良いという事でしょうか?
0012デフォルトの名無しさん
2006/06/13(火) 14:06:41CString a = "fhsoeriojtotetototo";
CString b = "totetototo";
const char * c = Strstr(a, b);
// でいいじゃん。で、文字列長はStrstr()内でstrlen()すればいいし。
//# 文字列長を引き数で渡す積極的理由があるならそれはそれでいいが。
0013デフォルトの名無しさん
2006/06/13(火) 14:41:20なるほど〜
文字列長を引数で渡しのは検索を連続で行うためなんですよ。もっと長い文字列ときに同じ単語がいくつかでるので、
関数内でだと、strlenが何度も呼び出されるからです。
って、参考にしたサイトで書いてましたw
あと、CString.FindやReplaceで検索や置換を行った方が処理は早いんでしょうか?
それとも、BM法でやった方が処理は早いんでしょうか?
質問ばかりですみません。お願いします。
0014デフォルトの名無しさん
2006/06/13(火) 15:11:11ユーザー関数の戻り値が帰ってくるまでの時間がランダムの
場合、その戻ってくる時間分だけ待機させるのってどうしたらいいでしょう?
CheckISSError :ユーザー関数
for( i = 0 ; i < 15 ; i++){
iRet = CheckISSError( i );
if(iRet < 0){
エラーの場合の処理
}
::Sleep(700);
}
現状では ::Sleep(700); をいれることでもたつきますが正常に動作してます。
WaitForSingleObjectを使用すればいいのでは?とご教授頂いたのですが
どのように利用すればいいのかもわからない状態です。
何方かご存知の方 ご教授願えませんでしょうか?
0015デフォルトの名無しさん
2006/06/13(火) 15:13:02CStringならGetLengthで文字数が得られる。
元がbmp(a, b, len, n);なんだろ。
そこへ自分で多重定義してやればいいだろ。
const char* bmp(const char* a, const char* b)
{
return bmp(a, b, std::strlen(a), std::strlen(b);
}
const char* bmp(const CString& a, const CString& b)
{
return bmp(a, b, a.GetLength(), b.GetLength());
}
0016デフォルトの名無しさん
2006/06/13(火) 15:42:23なるほど。多重定義ですか!
全然思いつかなかったw
大変勉強になりました☆ありがとうございます☆
0017デフォルトの名無しさん
2006/06/13(火) 17:19:41strlen程の速度を気にするんだったら、
CStringを使わずchar*とintで文字列と文字数を渡してやる方がよくね?
0018デフォルトの名無しさん
2006/06/13(火) 19:48:18>>9です。なんとか解決しました。ありがとうございました。
0019デフォルトの名無しさん
2006/06/13(火) 20:05:10コマンドプロンプトに出力されません。
どこか設定おかしいのでしょうか?
よろしくお願いします。
0020デフォルトの名無しさん
2006/06/13(火) 20:10:08貴方の頭の設定がおかしいんですよ。
0021デフォルトの名無しさん
2006/06/13(火) 20:25:25ある関数でDebugモードでは正常に機能するのに
Releaseモードでは戻り値が空になって返ってくるようになってしまいました.
ちなみに,その現象がお起こるファイルは,
ブレイクポイントにて
現在実行されていると表示されている行と
実際実行されている行とでは数行の開き
(実際は5〜7行崎を実行中)
があるようなのです(MesseageBoxにて確認)
このような症状ってどうやれば直るのでしょうか?
0022デフォルトの名無しさん
2006/06/13(火) 20:30:44プロジェクトを作るときには何を選んだ?
ただのC/C++ならWin32コンソール アプリケーションだよ。
0023デフォルトの名無しさん
2006/06/13(火) 20:45:55全てリビルド。
GetBuffer / ReleaseBuffer しないで書き込んでるとか、
その類のことではないだろうか。
002421
2006/06/13(火) 22:07:30リビルドしても,Release/Debugフォルダ全消去しても同じでした.
GetBufferというか,CStringそのままでしか使っていないので関係ないと思いますが...
ほかに何かないでしょうか?
002519
2006/06/13(火) 22:22:51もちろんプロジェクトはWin32コンソールアプリケーションです。
で、設定でコンソールアプリケーションを選択。
追加オプションの空のプロジェクトにチェック入れました。
0026デフォルトの名無しさん
2006/06/13(火) 22:26:35ReleaseビルドでBreakPointがずれているように見える現象は、最適化ゆえ。
Releaseビルドでも最適化しないようにすればずれないよ。
0027デフォルトの名無しさん
2006/06/13(火) 22:57:31ちゃんと標準出力に出力してる?
標準出力のハンドルは合ってる?って普通は合ってるやな
002819
2006/06/13(火) 23:19:26#include<iostream>
using namespace std;
int main(){
cout << "Hello World" << endl;
return 0;
}
0029デフォルトの名無しさん
2006/06/14(水) 00:27:06そうですねぇw
それは確かに思いました。
ただ、どっかのサイトで統一した方が良いと書いてありましたのでw
17さんなら、どうしますか?
0030デフォルトの名無しさん
2006/06/14(水) 00:38:28http://www.sm.rim.or.jp/~shishido/kaiten.html
↑でBITMAP回転処理を解説されていますよみましたか?
003117
2006/06/14(水) 00:40:07速度が必要なら自分でゴリゴリ書くけど
そうじゃないなら汎用性と読みやすさ重視だね。
そーいやstl::stringを使うという選択肢もあるな
0032デフォルトの名無しさん
2006/06/14(水) 01:31:48なるほど〜 うまくいきました☆
で、さらに問題が・・・検索した文字列を置換をしたいんですが、
constを外すと、当然なんですが、エラーが出ます。
この場合はどうしたら良いでしょうか?
0033デフォルトの名無しさん
2006/06/14(水) 01:58:13class A
{
template < int T > void F();
template <> void F<0>F(){...};
}
なんてコードを書くと、クラスビューにこのクラスが認識されなくなるんだが。
これって俺だけ?
ちなみに特殊化したFを消すと再認識される
003433
2006/06/14(水) 01:59:190035デフォルトの名無しさん
2006/06/14(水) 02:04:09どこをどう直せばよいのでしょうか?
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define NX 41
#define NY 41
void SetBoundaryCondition(double T[NY][NX])
{
int x;
int y;
for (x = 0; x < NX; x++)
{T[0][x] = 0.5;}
for (x = 0; x < NX; x++)
{T[NY-1][x] = 0.0;}
for (y = 0; y < NY; y++)
{T[y][0] = 1.0;}
for (y = 0; y < NY; y++)
{T[y][NX-1] = 0.0;}
*つづく*
0036デフォルトの名無しさん
2006/06/14(水) 02:06:25int main(void)
{
const double dx = 1.0 / NX;
const double dy = 1.0 / NY;
const double C1 = 0.5 * dx*dx / (dx*dx + dy*dy);
const double C2 = 0.5 * dy*dy / (dx*dx + dy*dy);
int i;
int j;
double errorMax;
double previousValue;
SetBoundaryCondition(T[NY][NX]);
do
{
errorMax = 0.0;
for (i = 1; i < NY-1; i++)
{
for (j = 1; j < NX-1; j++)
{previousValue = T[i][j];
T[i][j] = C1*(T[i+1][j] + T[i-1][j]) + C2*(T[i][j+1] + T[i][j-1]);
if (errorMax < fabs(T[i][j] - previousValue))
{errorMax = fabs(T[i][j] - previousValue);}}}
} while (errorMax > 0.00001);
for (i = 0; i < NY; i++)
{for (j = 0; j < NX; j++)
{printf("%d\t%d\t%15.15f\n", j, i, T[i][j]);}
}
return 0;}
よろしくお願いします。
0037デフォルトの名無しさん
2006/06/14(水) 02:55:59CStringで+していくか、出来上がったバッファをCStringに代入。
前者:
CString foo = "abc";
foo += "def";
後者:
CString foo = "abc";
char buf[20];
sprintf(buf, "%sdef", foo);
foo = buf;
0038デフォルトの名無しさん
2006/06/14(水) 07:26:51だったらCString&なんかを渡せばいいだろ。
0039デフォルトの名無しさん
2006/06/14(水) 08:34:49置換じゃ置換後の文字列長さが不定なので全然違ってくる
お手軽にやりたいんならCStringを渡すのが楽。
CStringを使わないなら自分で領域確保してそのアドレスを戻す。
0040デフォルトの名無しさん
2006/06/14(水) 08:37:00どこがうまくいかない?
エラーメッセージは?
0041デフォルトの名無しさん
2006/06/14(水) 09:25:08ありがとうございます☆
確かにそれなら、簡単にできそうです!!
感謝です☆
0043デフォルトの名無しさん
2006/06/14(水) 10:26:07エラーメッセージ貼るなら、どの行か判るようにしてくれ。
で、恐らくmain()で配列Tが宣言されていないのでエラーになっていると思われる。
関数の呼び方も間違っている。訂正するならこんな感じか。
>SetBoundaryCondition(T[NY][NX]);
↓
>double T[NY][NX];
>SetBoundaryCondition(T);
004435
2006/06/14(水) 11:11:07ありがとうございます。無事ビルドできました。
しかし今度はデバッグで
'熱伝導.exe': 'C:\Documents and Settings\服部 正太郎\My Documents\Visual Studio 2005\Projects\熱伝導\debug\熱伝導.exe' を
読み込みました。バイナリはデバッグ情報と一緒にビルドされませんでした。
'熱伝導.exe': 'C:\WINNT\system32\NTDLL.DLL' を読み込みました。必要な DBG ファイルが見つからないか、開けません。
'熱伝導.exe': 'C:\WINNT\system32\KERNEL32.DLL' を読み込みました。必要な DBG ファイルが見つからないか、開けません。
プログラム '[2216] 熱伝導.exe: ネイティブ' はコード 0 (0x0) で終了しました。
と出ました。何故でしょうか?
Visual C++ 2005 Express Editionを使っているのですが。
0045デフォルトの名無しさん
2006/06/14(水) 11:22:10オマイ、名前、名前!!
004635
2006/06/14(水) 11:30:370047デフォルトの名無しさん
2006/06/14(水) 11:35:290048デフォルトの名無しさん
2006/06/14(水) 12:06:46本名に1票!!
0049デフォルトの名無しさん
2006/06/14(水) 12:47:490050デフォルトの名無しさん
2006/06/14(水) 13:52:29デバッグ用んp設定とリリース用の設定が混じってる希ガス
環境設定間違ってね?
もっかい新規作成からやってみれば?
ソースはコピペすればいいんだし
005135
2006/06/14(水) 15:29:230052デフォルトの名無しさん
2006/06/14(水) 15:34:15よく嫁!
そして無視しろ
以上
0053デフォルトの名無しさん
2006/06/14(水) 15:54:16処理をおこなうようにしたいのですが、キー入力してもエラー音が出て
WM_CHAR:の処理をおこなってくれません。
あまり関係なさそうなところを省くと、ソースは下のようになってます。
int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst,LPSTR lpsCmdLine, int nCmdShow)
{
DialogBox(hCurInst, MAKEINTRESOURCE(IDD_DIALOG1), NULL, (DLGPROC)DlgProc);
return 0;
}
LRESULT CALLBACK DlgProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
switch (msg) {
case WM_INITDIALOG:〜
case WM_CHAR:〜
case WM_COMMAND:〜
}
ダイアログだけで済むものを考えているので、WindowProcはありません。
なにか分かることがありましたら、お願いします。
0054デフォルトの名無しさん
2006/06/14(水) 16:12:08入力フォーカスって関係ある?
005533
2006/06/14(水) 16:25:420056デフォルトの名無しさん
2006/06/14(水) 16:37:30ありがとうございます。
キーを押されたらそれに応じて、スタティックテキストを書き換えるように
してたので、エディット欄は設けていませんでした。
エディット欄を設けると、当然そこには入力できるのですが、やはりWM_CHAR:
に記述した処理はおこなってくれません。
キーが押されると、WM_CHARのメッセージが渡されるという理解で
間違ってないでしょうか?
0057デフォルトの名無しさん
2006/06/14(水) 16:49:56WM_KEYDOWN あたりを見ると幸せに・・・なれたらいいなぁ
>>55
すまん。テンプレートは苦手じゃ
0059デフォルトの名無しさん
2006/06/14(水) 22:52:23CPU情報を表示するソフトを作りたいのですが
CrusoeのCPUが判定できる 外部DLLってありますか?
[作りたいもの]
c:\>cpuinfo
と打つと
Crusoe 933MHz
と表示される
0060デフォルトの名無しさん
2006/06/14(水) 23:24:07OS:win2k or winXP
VC++でブレークポイントを設定すると固まることがまれにあります。
解決方法をご存知の方がいらっしゃいましたらご教示願います。
スレッドを作成しています。
0061デフォルトの名無しさん
2006/06/14(水) 23:35:25DirectInput だかなんだかの問題じゃなかったっけ・・・
http://www.microsoft.com/japan/msdn/directx/techart/nodelaydirectinput.asp
0062デフォルトの名無しさん
2006/06/14(水) 23:38:21http://support.microsoft.com/default.aspx?scid=kb;ja;418661
0063デフォルトの名無しさん
2006/06/15(木) 01:11:37情報どうもありがとうございます
ただ、DirectInput は使用していません
MFC使用、SDI,スレッドにmessageループ(PostThreadMessage->GetMessage)を使用しています
スレッドにブレークポイントを設定したときに固まる傾向にあります。
>>62
Windows XP Service Pack 1 以上も当てています(たぶんService Pack 2)し、
Win2kでもおきます。
プログラムが糞だから起きるのでしょうか?たぶんそうです
0064デフォルトの名無しさん
2006/06/15(木) 01:13:570065デフォルトの名無しさん
2006/06/15(木) 03:41:15「libc.libファイルが開けません」というエラーが出たのでググってみたのですが
『libc.libはVS2005では削除されて、代わりにマルチスレッド用libcmt.libがある』
とのこと。
これはどうやって解決したらよいのでしょうか。
よろしくお願いします。
0066デフォルトの名無しさん
2006/06/15(木) 05:46:03プロジェクトの設定を見直す。
0067デフォルトの名無しさん
2006/06/15(木) 07:26:110068デフォルトの名無しさん
2006/06/15(木) 21:19:06/*****************
* hello *
* world *
*****************/
#include <stdio.h>
int main()
{printf("Hello World!");
return 0;}
っていう入門書に書いてあったやつをそのまま作ったんですが、実行すると一瞬だけ表示されてすぐに消えてしまいます。
たぶん写し間違えとかはないと思うんですが・・・
なにとぞご教授ください。
0069デフォルトの名無しさん
2006/06/15(木) 21:30:56それでおそらく合ってます
出来たexeファイルをコマンドプロンプトから実行してみてください
0070デフォルトの名無しさん
2006/06/15(木) 23:22:30int main()
{printf("Hello World!");
while(1); //←この行を追加しましょう
return 0;}
0071デフォルトの名無しさん
2006/06/15(木) 23:50:20こらこら。いたずらは程ほどに。
0072デフォルトの名無しさん
2006/06/16(金) 00:33:04は〜い
実行すると一瞬だけ表示されてすぐに消えるのは、
windowsの標準設定にてプログラムが終了したら窓を閉じる
という設定になっているためです。
解決方法は2種類
1.プログラムがすぐに終了しないような処理を書く
⇒70の無限ループや、キー入力待ちの処理を入れる方法
2.窓を勝手に閉じなくする
⇒69や、プロパティでプログラム終了したら窓を閉じるという
チェックボックスを外す方法
があります。以上
0073デフォルトの名無しさん
2006/06/16(金) 09:52:58コンソールアプリは、処理が終わると同時に
コンソールウィンドウも閉じる
ただ、コメントの内容は
ちゃんとこのプログラムは・・・をするプログラム
ってかんじで書いたほうがよいです。
でも、ちゃんとコメントを書くってのは良いことです。
0074デフォルトの名無しさん
2006/06/16(金) 12:08:58CStringで入力した数値をint型に変換するにはatoi関数を使うとわかったのですが、
CString型をdoubleまたはfloat型に変換するには何を使ったらよいんでしょうか?
調べても見つかりませんorz
お願いします。
0075デフォルトの名無しさん
2006/06/16(金) 12:23:500076デフォルトの名無しさん
2006/06/16(金) 13:28:35できた。�dクス。
0077デフォルトの名無しさん
2006/06/17(土) 15:57:42実行したウインドウをなんども移動させたりすると、メモリーリーク??を起こしているのか
途中から画面が真っ白になってしまいます。何が悪いのでしょうか。
LRESULT CALLBACK WndProc(HWND hWnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
static HWND hWndDesktop;//デスクトップのHWND
static HDC hDCDesktop;//デスクトップのHDC
switch(message)
{
case WM_CREATE:
hWndDesktop = GetDesktopWindow();
return 0;
case WM_PAINT:
hDCDesktop = GetDC(hWndDesktop);
BitBlt(GetDC(hWnd), 0, 0, 100, 100, hDCDesktop, 0, 0, SRCCOPY);
ReleaseDC(hWndDesktop,hDCDesktop);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
}
0078デフォルトの名無しさん
2006/06/17(土) 16:03:53WM_PAINTではGetDC(hWnd)ではなくBeginPaintを使え。
BeginPaintを呼ぶことでWindowsはそのウィンドウへ描画されていると認識する。
勿論EndPaintを忘れないように。
あと、デスクトップのウィンドウハンドルからGetDCしなくても、単にGetDC(0)で良いはず。
008077
2006/06/17(土) 16:33:40画面が真っ白になるのは解消されました。
そこで質問なのですが、hDCDesktop;(画面全体のHDC)は
開放しなくていいのでしょうか?
HDC hDCDesktop;//デスクトップのHDC
HDC hDC;//コピー先のHDC
PAINTSTRUCT ps;//BeginPaintのために宣言(使用しない?)
switch(message)
{
case WM_PAINT:
hDCDesktop = GetDC(0);
hDC = BeginPaint(hWnd, &ps);
BitBlt(hDC, 0, 0, 100, 100, hDCDesktop, 0, 0, SRCCOPY);
EndPaint(hWnd, &ps);
return 0;
008177
2006/06/17(土) 16:42:21なぜか再描画がされないときもありますが、だいぶちゃんと動くようになりました。
こんな感じでいいのかなあ・・・。ありがとうございました。
static HWND hWndDesktop;//デスクトップのHWND
HDC hDCDesktop;//デスクトップのHDC
HDC hDC;//コピー先のHDC
PAINTSTRUCT psDesktop, ps;//BeginPaintのために宣言(使用しない?)
switch(message)
{
case WM_CREATE:
hWndDesktop=GetDesktopWindow();
case WM_PAINT:
hDCDesktop = BeginPaint(hWndDesktop, &psDesktop);
hDC = BeginPaint(hWnd, &ps);
BitBlt(hDC, 0, 0, 100, 100, hDCDesktop, 0, 0, SRCCOPY);
EndPaint(hWnd, &ps);
EndPaint(hWndDesktop, &psDesktop);
return 0;
0082デフォルトの名無しさん
2006/06/17(土) 18:33:39double sum(double x[],int n)
double average(double x[],int n)
を使って作成したいのですが全く分かりません。
どなたか作成して頂けないでしょうか。
クレクレ君ですみません
0083デフォルトの名無しさん
2006/06/17(土) 20:51:34BeginPaintが使えるのはWM_PAINTが来た時
かつそのWM_PAINTを受け取ったウィンドウに対してのみ。
だからデスクトップに対してはGetDC(0)しろ。
GetDCには常にReleaseDCが必要と思え。
0084デフォルトの名無しさん
2006/06/17(土) 20:53:26宿題なら宿題スレへ。
0086デフォルトの名無しさん
2006/06/18(日) 09:52:38失礼しました。
0087デフォルトの名無しさん
2006/06/18(日) 15:03:05詳細を見たらcstdioやcstlibで構文エラーが出てます。
どうしたらコンパイルできますぁ。
0088デフォルトの名無しさん
2006/06/18(日) 15:32:02自分のソースを見直した上で、リビルド。それでもダメなら新規プロジェクトでやり直してみるとか。
008987
2006/06/18(日) 16:50:55visualc++を再起動したら直りました。
ありがとうございました。
0090デフォルトの名無しさん
2006/06/19(月) 16:12:58実行するとデスクトップの色に関わらずRGB(255,255,255)と表示されます。
いったん、デスクトップのコンパチブルDCを作成してそこにBitBltし、
そのコンパチブルDCの座標をGetPixelというちょっと面倒な事をしています。何が原因なんでしょうか。
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){
static HDC hDCDesktop;
HDC hDCTemp;
TCHAR s[80];
COLORREF clr;
int ix = 200, iy = 200;//任意の座標(200,200)
switch(message){
case WM_KEYDOWN:
hDCDesktop = GetDC(0); //デスクトップのDC
hDCTemp = CreateCompatibleDC(hDCDesktop); //デスクトップのコンパチブルDC
BitBlt(hDCTemp, 0, 0, 500, 500, hDCDesktop, 0, 0, SRCCOPY);
clr = GetPixel(hDCTemp, ix, iy);
ReleaseDC(0, hDCTemp);
ReleaseDC(0, hDCDesktop);
wsprintf(s, "COLOR: R [%d] G[%d] B[%d]",
GetRValue(clr), GetGValue(clr), GetBValue(clr));
MessageBox(hWnd, s, "CHECK", MB_OK);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
}
0091デフォルトの名無しさん
2006/06/19(月) 16:42:14CreateCompatibleDCでDCを作ると、描画対象のビットマップはシステムで共有される
1x1ピクセルのものが設定されています。CreateCompatibleBitmap で bitmap を作って
SelectObject で設定してあげないといけない。
それから CreateCompatibleDC で作った DC は DeleteDC で開放する。このとき、
事前に最初に設定されていたビットマップをSelectObjectで設定しなおすこと。
hdc = CreateCompatibleDC()
hbitmap = CreateCompatibleBitmap()
tmp = SelectObject(hdc, hbitmap)
作ったDCを使用
SelectObject(hdc, tmp); // 元に戻す
DeleteDC(hdc)
DeleteObject(hbitmap)
009390
2006/06/19(月) 18:07:12LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){
HDC hDC,hDCDesktop;
HBITMAP hBitmap, hBitmapOld;
TCHAR s[80];
COLORREF clr;
const int ix = 200, iy = 200;//任意の座標(200,200)
switch(message){
case WM_KEYDOWN:
hDCDesktop = GetDC(0);
hDC = CreateCompatibleDC(hDCDesktop);
hBitmap = CreateCompatibleBitmap(hDCDesktop, 500, 500);
hBitmapOld = (HBITMAP)SelectObject(hDC, hBitmap);
BitBlt(hDC, 0, 0, 500, 500, hDCDesktop, 0, 0, SRCCOPY);
clr = GetPixel(hDC, ix, iy);
SelectObject(hDC, hBitmapOld);
DeleteObject(hBitmap);
DeleteDC(hDC);
ReleaseDC(0, hDCDesktop);
wsprintf(s, "COLOR: R [%d] G[%d] B[%d]",
GetRValue(clr), GetGValue(clr), GetBValue(clr));
MessageBox(hWnd, s, "CHECK", MB_OK);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
}
0094デフォルトの名無しさん
2006/06/20(火) 13:31:54自分の作ったアプリを他人のPCに持って行って動かした時に落ちてしまいます
その時に
アドレス0x12345678から無効なアドレス0x0000000Cを参照した
というようなダイアログが出ます。
このアドレスをメモしておいて、自宅に帰った後、どの関数で落ちているのか調べたいのですが
そのようなことはどうやったらできるでしょうか
どうかご教示願います
VC2005です
0095デフォルトの名無しさん
2006/06/20(火) 14:11:26やり方さえ知ってれば、というかあるツールさえあれば、簡単にそのアドレスから
ソースコードの行番号に変換することができます。(それを使う前準備が必要
なんですが)
『.NET & Windows プログラマのためのデバッグテクニック徹底解説』という書籍に
詳しい解析方法が載っています。
そのツールとはCrashFinderという名前のもので、ググればどこかにころがって
いるかもしれません。
0096デフォルトの名無しさん
2006/06/20(火) 14:31:37ありがとうございます
その本を読んでみます
0097デフォルトの名無しさん
2006/06/20(火) 22:09:36値段を見てみたら1万円なんですね…
立ち読みしようと思って大きな本屋に行きましたが見つからなかったです…orz
009895
2006/06/20(火) 23:59:17では、ググるためのキーワードをいくつか。
・クラッシュアドレス
・MAP
・pdb
英語でも検索してみてください。
どこかに懇切丁寧にやり方を解説しているページがあるかもしれません。
0099デフォルトの名無しさん
2006/06/21(水) 00:09:18リソースファイルの追加ダイアログでToolBarだけ存在しません。
バージョンによって違うのですか?
0100デフォルトの名無しさん
2006/06/21(水) 01:14:55自作クラスからMFCが作成したクラスにメッセージを投げる方法を教えて頂けないでしょうか?
コンソールアプリで動く自作クラスでマルチメディアタイマーをつけてみました。
このクラスをMFCに組み込んで、タイマーが呼び出すコールバック関数から
MFCが作成したクラスにメッセージを(SendMessage又はPostMessageで)投げたいのですが、
うまくゆきません。
・・・効率悪いとか言われそうですが、脳が足りない私に知恵を分けて頂けませんか?
宜しくお願いします。
0101デフォルトの名無しさん
2006/06/21(水) 11:08:00いや、普通に投げられるよ
ウィンドウハンドルが間違ってるか、メッセージがフィルタリングされてるか、どっちかじゃない?
投げてるメッセージはWM_APP以降だよな?
■ このスレッドは過去ログ倉庫に格納されています