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

くだすれ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:30
質問させてください。
Visual 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
>>1
乙
0004デフォルトの名無しさん2006/06/13(火) 01:56:07
VC++について質問させて頂きます。
関数でCStringのポインタを使って、直接文字列をいじりたいんですけど、
それをやろうとしてもエラーが出たりします。本を見たりネットを見たりして
色々と試したんですが、どれもうまくいきません。
char型のように関数で文字列を直接扱うことはできるんでしょうか?
0005デフォルトの名無しさん2006/06/13(火) 02:02:49
>>4
できるよ
どう扱うのかわからんからサンプルくれ

あと、

 CString str;
 strcpy( &str, "hoge" );

とかはするなよ!絶対!!
0006デフォルトの名無しさん2006/06/13(火) 02:31:35
int Strcmp(char* text, char* pattern){int index;
for(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を使って扱いたいわけです。
0007>>6です2006/06/13(火) 04:03:21
>>5

えっと、ダメでしょうか?
すみません。見づらいとは思いますが、お願いします。
0008デフォルトの名無しさん2006/06/13(火) 07:11:46
>>7
それは止めたほうがいいよ。引数の char* を const char* にすれば CString を
(暗黙のキャストで)渡せるようになるから、それくらいで満足しておくべき。
UNICODE でもOKにするなら const TCHAR * で。
0009デフォルトの名無しさん2006/06/13(火) 08:18:02
すみません。教えてください。SDIで表示したBitmapを任意で360度自由に回転させたいのですが、どうすればいいのでしょうか??

教えてください。携帯からですみません。
0010デフォルトの名無しさん2006/06/13(火) 10:57:53
>>9
自分で計算して描画 or DirectXを使う
0011デフォルトの名無しさん2006/06/13(火) 13:51:44
>>8

つまり、const char* 以外の方法は無いって事でしょうか?
CStringで文字列を格納して、関数で受けるときはcharを使った方が良いという事でしょうか?
0012デフォルトの名無しさん2006/06/13(火) 14:06:41
const char * Strstr(const char * a, const char * b);
CString a = "fhsoeriojtotetototo";
CString b = "totetototo";
const char * c = Strstr(a, b);
// でいいじゃん。で、文字列長はStrstr()内でstrlen()すればいいし。
//# 文字列長を引き数で渡す積極的理由があるならそれはそれでいいが。
0013デフォルトの名無しさん2006/06/13(火) 14:41:20
>>12
なるほど〜
文字列長を引数で渡しのは検索を連続で行うためなんですよ。もっと長い文字列ときに同じ単語がいくつかでるので、
関数内でだと、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:02
>>13
CStringなら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
>>15

なるほど。多重定義ですか!
全然思いつかなかったw

大変勉強になりました☆ありがとうございます☆
0017デフォルトの名無しさん2006/06/13(火) 17:19:41
>>13
strlen程の速度を気にするんだったら、
CStringを使わずchar*とintで文字列と文字数を渡してやる方がよくね?
0018デフォルトの名無しさん2006/06/13(火) 19:48:18
>>10

>>9です。なんとか解決しました。ありがとうございました。
0019デフォルトの名無しさん2006/06/13(火) 20:05:10
VC++2005で普通にhello worldみたいなコンソール出力用のプログラムを作成したのですが、
コマンドプロンプトに出力されません。
どこか設定おかしいのでしょうか?

よろしくお願いします。
0020デフォルトの名無しさん2006/06/13(火) 20:10:08
>>19
貴方の頭の設定がおかしいんですよ。
0021デフォルトの名無しさん2006/06/13(火) 20:25:25
CStringを扱っているのですが.
ある関数でDebugモードでは正常に機能するのに
Releaseモードでは戻り値が空になって返ってくるようになってしまいました.

ちなみに,その現象がお起こるファイルは,
ブレイクポイントにて
現在実行されていると表示されている行と
実際実行されている行とでは数行の開き
(実際は5〜7行崎を実行中)
があるようなのです(MesseageBoxにて確認)
このような症状ってどうやれば直るのでしょうか?
0022デフォルトの名無しさん2006/06/13(火) 20:30:44
>>19
プロジェクトを作るときには何を選んだ?
ただのC/C++ならWin32コンソール アプリケーションだよ。
0023デフォルトの名無しさん2006/06/13(火) 20:45:55
>>21
全てリビルド。
GetBuffer / ReleaseBuffer しないで書き込んでるとか、
その類のことではないだろうか。
0024212006/06/13(火) 22:07:30
>>23
リビルドしても,Release/Debugフォルダ全消去しても同じでした.
GetBufferというか,CStringそのままでしか使っていないので関係ないと思いますが...
ほかに何かないでしょうか?
0025192006/06/13(火) 22:22:51
>>22
もちろんプロジェクトはWin32コンソールアプリケーションです。
で、設定でコンソールアプリケーションを選択。
追加オプションの空のプロジェクトにチェック入れました。
0026デフォルトの名無しさん2006/06/13(火) 22:26:35
>>21
ReleaseビルドでBreakPointがずれているように見える現象は、最適化ゆえ。
Releaseビルドでも最適化しないようにすればずれないよ。
0027デフォルトの名無しさん2006/06/13(火) 22:57:31
>>19
ちゃんと標準出力に出力してる?
標準出力のハンドルは合ってる?って普通は合ってるやな
0028192006/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
>>17
そうですねぇw
それは確かに思いました。
ただ、どっかのサイトで統一した方が良いと書いてありましたのでw
17さんなら、どうしますか?
0030デフォルトの名無しさん2006/06/14(水) 00:38:28
>>9さん
http://www.sm.rim.or.jp/~shishido/kaiten.html
↑でBITMAP回転処理を解説されていますよみましたか?
0031172006/06/14(水) 00:40:07
自分なら>>12

速度が必要なら自分でゴリゴリ書くけど
そうじゃないなら汎用性と読みやすさ重視だね。

そーいやstl::stringを使うという選択肢もあるな
0032デフォルトの名無しさん2006/06/14(水) 01:31:48
>>17
なるほど〜 うまくいきました☆

で、さらに問題が・・・検索した文字列を置換をしたいんですが、
constを外すと、当然なんですが、エラーが出ます。
この場合はどうしたら良いでしょうか?
0033デフォルトの名無しさん2006/06/14(水) 01:58:13
ちょっとおかしな現象なんだが、
class A
{
template < int T > void F();
template <> void F<0>F(){...};
}
なんてコードを書くと、クラスビューにこのクラスが認識されなくなるんだが。
これって俺だけ?
ちなみに特殊化したFを消すと再認識される

0034332006/06/14(水) 01:59:19
;がないってのは突っ込まんで。
0035デフォルトの名無しさん2006/06/14(水) 02:04:09
すみません、このプログラムの境界条件Tの宣言がうまくいきません。
どこをどう直せばよいのでしょうか?

#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:25
*つづき*

int 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:59
>>32
CStringで+していくか、出来上がったバッファを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
>>32
だったらCString&なんかを渡せばいいだろ。
0039デフォルトの名無しさん2006/06/14(水) 08:34:49
>>32
置換じゃ置換後の文字列長さが不定なので全然違ってくる
お手軽にやりたいんならCStringを渡すのが楽。
CStringを使わないなら自分で領域確保してそのアドレスを戻す。
0040デフォルトの名無しさん2006/06/14(水) 08:37:00
>>35
どこがうまくいかない?
エラーメッセージは?
0041デフォルトの名無しさん2006/06/14(水) 09:25:08
>>37-39
ありがとうございます☆
確かにそれなら、簡単にできそうです!!
感謝です☆
0042352006/06/14(水) 09:48:39
>>40
error C2065: 'T' : 定義されていない識別子です。]

と出ます。

どのように直せば良いのでしょうか?
0043デフォルトの名無しさん2006/06/14(水) 10:26:07
>>42
エラーメッセージ貼るなら、どの行か判るようにしてくれ。

で、恐らくmain()で配列Tが宣言されていないのでエラーになっていると思われる。
関数の呼び方も間違っている。訂正するならこんな感じか。
>SetBoundaryCondition(T[NY][NX]);
↓
>double T[NY][NX];
>SetBoundaryCondition(T);
0044352006/06/14(水) 11:11:07
>>43
ありがとうございます。無事ビルドできました。
しかし今度はデバッグで

'熱伝導.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
>>44
オマイ、名前、名前!!
0046352006/06/14(水) 11:30:37
さすがに本名じゃないんで、無問題です。
0047デフォルトの名無しさん2006/06/14(水) 11:35:29
本名だろw
0048デフォルトの名無しさん2006/06/14(水) 12:06:46
服部 正太郎って今時あるのか?w

本名に1票!!
0049デフォルトの名無しさん2006/06/14(水) 12:47:49
マキ凛花
0050デフォルトの名無しさん2006/06/14(水) 13:52:29
>>44
デバッグ用んp設定とリリース用の設定が混じってる希ガス
環境設定間違ってね?
もっかい新規作成からやってみれば?
ソースはコピペすればいいんだし
0051352006/06/14(水) 15:29:23
新規作成してみましたが、解決しませんでした。
0052デフォルトの名無しさん2006/06/14(水) 15:34:15
>>51
よく嫁!
そして無視しろ
以上
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
>>53
入力フォーカスって関係ある?
0055332006/06/14(水) 16:25:42
何。俺だけ?この現象
0056デフォルトの名無しさん2006/06/14(水) 16:37:30
>>54
ありがとうございます。

キーを押されたらそれに応じて、スタティックテキストを書き換えるように
してたので、エディット欄は設けていませんでした。
エディット欄を設けると、当然そこには入力できるのですが、やはりWM_CHAR:
に記述した処理はおこなってくれません。

キーが押されると、WM_CHARのメッセージが渡されるという理解で
間違ってないでしょうか?
0057デフォルトの名無しさん2006/06/14(水) 16:49:56
>>56
WM_KEYDOWN あたりを見ると幸せに・・・なれたらいいなぁ

>>55
すまん。テンプレートは苦手じゃ
0058352006/06/14(水) 17:58:50
>>52
了解、無視します。
ありがとうございました。
0059デフォルトの名無しさん2006/06/14(水) 22:52:23
前スレで質問したのですが回答得られなかったので教えてください

CPU情報を表示するソフトを作りたいのですが
CrusoeのCPUが判定できる 外部DLLってありますか?
[作りたいもの]
c:\>cpuinfo
と打つと
Crusoe 933MHz
と表示される
0060デフォルトの名無しさん2006/06/14(水) 23:24:07
バージョン:VC++6.0
OS:win2k or winXP
VC++でブレークポイントを設定すると固まることがまれにあります。
解決方法をご存知の方がいらっしゃいましたらご教示願います。
スレッドを作成しています。
0061デフォルトの名無しさん2006/06/14(水) 23:35:25
それ経験したし、原因も何かで読んだな。
DirectInput だかなんだかの問題じゃなかったっけ・・・

http://www.microsoft.com/japan/msdn/directx/techart/nodelaydirectinput.asp
0062デフォルトの名無しさん2006/06/14(水) 23:38:21
これもあった
http://support.microsoft.com/default.aspx?scid=kb;ja;418661
0063デフォルトの名無しさん2006/06/15(木) 01:11:37
>>61さん
情報どうもありがとうございます
ただ、DirectInput は使用していません
MFC使用、SDI,スレッドにmessageループ(PostThreadMessage->GetMessage)を使用しています
スレッドにブレークポイントを設定したときに固まる傾向にあります。

>>62
Windows XP Service Pack 1 以上も当てています(たぶんService Pack 2)し、
Win2kでもおきます。
プログラムが糞だから起きるのでしょうか?たぶんそうです
0064デフォルトの名無しさん2006/06/15(木) 01:13:57
スレッドの同期待ちになってるとか
0065デフォルトの名無しさん2006/06/15(木) 03:41:15
PGPLOTというグラフ作成ツールを導入したいのですが、うまくいきません。
「libc.libファイルが開けません」というエラーが出たのでググってみたのですが
『libc.libはVS2005では削除されて、代わりにマルチスレッド用libcmt.libがある』
とのこと。

これはどうやって解決したらよいのでしょうか。
よろしくお願いします。
0066デフォルトの名無しさん2006/06/15(木) 05:46:03
>>65
プロジェクトの設定を見直す。
0067デフォルトの名無しさん2006/06/15(木) 07:26:11
マルチし始めたな。
0068デフォルトの名無しさん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
>>68
それでおそらく合ってます
出来たexeファイルをコマンドプロンプトから実行してみてください
0070デフォルトの名無しさん2006/06/15(木) 23:22:30
#include <stdio.h>

int main()
{printf("Hello World!");
while(1); //←この行を追加しましょう
return 0;}
0071デフォルトの名無しさん2006/06/15(木) 23:50:20
>>70
こらこら。いたずらは程ほどに。
0072デフォルトの名無しさん2006/06/16(金) 00:33:04
>>71
は〜い
実行すると一瞬だけ表示されてすぐに消えるのは、
windowsの標準設定にてプログラムが終了したら窓を閉じる
という設定になっているためです。
解決方法は2種類
1.プログラムがすぐに終了しないような処理を書く
 ⇒70の無限ループや、キー入力待ちの処理を入れる方法
2.窓を勝手に閉じなくする
 ⇒69や、プロパティでプログラム終了したら窓を閉じるという
  チェックボックスを外す方法

があります。以上
0073デフォルトの名無しさん 2006/06/16(金) 09:52:58
>>68
コンソールアプリは、処理が終わると同時に
コンソールウィンドウも閉じる
ただ、コメントの内容は
ちゃんとこのプログラムは・・・をするプログラム
ってかんじで書いたほうがよいです。
でも、ちゃんとコメントを書くってのは良いことです。
0074デフォルトの名無しさん2006/06/16(金) 12:08:58
教えてエロい人
CStringで入力した数値をint型に変換するにはatoi関数を使うとわかったのですが、
CString型をdoubleまたはfloat型に変換するには何を使ったらよいんでしょうか?
調べても見つかりませんorz
お願いします。
0075デフォルトの名無しさん2006/06/16(金) 12:23:50
atof
0076デフォルトの名無しさん2006/06/16(金) 13:28:35
おおおおお!
できた。�dクス。
0077デフォルトの名無しさん2006/06/17(土) 15:57:42
VC++ 6.0 でWindows SDKでデスクトップの一部をキャプチャするものを作っているのですが、
実行したウインドウをなんども移動させたりすると、メモリーリーク??を起こしているのか
途中から画面が真っ白になってしまいます。何が悪いのでしょうか。

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:53
>>77
WM_PAINTではGetDC(hWnd)ではなくBeginPaintを使え。
BeginPaintを呼ぶことでWindowsはそのウィンドウへ描画されていると認識する。
勿論EndPaintを忘れないように。

あと、デスクトップのウィンドウハンドルからGetDCしなくても、単にGetDC(0)で良いはず。
0079772006/06/17(土) 16:17:26
>>78
返答ありがとうごいます。早速試してみます。
0080772006/06/17(土) 16:33:40
>>77のプログラムを以下の様に変更してみました。
画面が真っ白になるのは解消されました。
そこで質問なのですが、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;
0081772006/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:39
キーボードからn個のデータを配列に読み込みn個の平均値を求めるプログラムを
double sum(double x[],int n)
double average(double x[],int n)
を使って作成したいのですが全く分かりません。
どなたか作成して頂けないでしょうか。
クレクレ君ですみません
0083デフォルトの名無しさん2006/06/17(土) 20:51:34
>>81
BeginPaintが使えるのはWM_PAINTが来た時
かつそのWM_PAINTを受け取ったウィンドウに対してのみ。

だからデスクトップに対してはGetDC(0)しろ。
GetDCには常にReleaseDCが必要と思え。
0084デフォルトの名無しさん2006/06/17(土) 20:53:26
>>82
宿題なら宿題スレへ。
0085772006/06/18(日) 00:58:06
>>83
ありがとうございます。言っている意味が理解できました。
0086デフォルトの名無しさん2006/06/18(日) 09:52:38
>>84
失礼しました。
0087デフォルトの名無しさん2006/06/18(日) 15:03:05
ソースを二つ入れてビルドしたら死ぬほどエラーが出てコンパイルできません。
詳細を見たらcstdioやcstlibで構文エラーが出てます。
どうしたらコンパイルできますぁ。
0088デフォルトの名無しさん2006/06/18(日) 15:32:02
>>87
自分のソースを見直した上で、リビルド。それでもダメなら新規プロジェクトでやり直してみるとか。
0089872006/06/18(日) 16:50:55
>>88
visualc++を再起動したら直りました。
ありがとうございました。
0090デフォルトの名無しさん2006/06/19(月) 16:12:58
何かキーを押すとデスクトップ上の任意の座標(200,200)の色を表示するプログラムなんですが、
実行するとデスクトップの色に関わらず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:14
>>90
CreateCompatibleDCで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)
0092902006/06/19(月) 16:50:25
>>91
有難う御座います。
CreateCompatibleDCを全然理解していませんでした。
早速試してみます。
0093902006/06/19(月) 18:07:12
正しく(たぶん?)動くようになりました。有難う御座いました。

LRESULT 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
>>94
やり方さえ知ってれば、というかあるツールさえあれば、簡単にそのアドレスから
ソースコードの行番号に変換することができます。(それを使う前準備が必要
なんですが)
『.NET & Windows プログラマのためのデバッグテクニック徹底解説』という書籍に
詳しい解析方法が載っています。
そのツールとはCrashFinderという名前のもので、ググればどこかにころがって
いるかもしれません。
0096デフォルトの名無しさん2006/06/20(火) 14:31:37
>>95
ありがとうございます
その本を読んでみます
0097デフォルトの名無しさん2006/06/20(火) 22:09:36
>>95
値段を見てみたら1万円なんですね…
立ち読みしようと思って大きな本屋に行きましたが見つからなかったです…orz
0098952006/06/20(火) 23:59:17
秋葉原に行けば確実なんですけどね・・・

では、ググるためのキーワードをいくつか。

・クラッシュアドレス
・MAP
・pdb

英語でも検索してみてください。

どこかに懇切丁寧にやり方を解説しているページがあるかもしれません。
0099デフォルトの名無しさん2006/06/21(水) 00:09:18
Visual Studio Spoke をつかっています。ToolBarを使いたいのですが

リソースファイルの追加ダイアログでToolBarだけ存在しません。

バージョンによって違うのですか?
0100デフォルトの名無しさん2006/06/21(水) 01:14:55
あのー

自作クラスからMFCが作成したクラスにメッセージを投げる方法を教えて頂けないでしょうか?

コンソールアプリで動く自作クラスでマルチメディアタイマーをつけてみました。
このクラスをMFCに組み込んで、タイマーが呼び出すコールバック関数から
MFCが作成したクラスにメッセージを(SendMessage又はPostMessageで)投げたいのですが、
うまくゆきません。

・・・効率悪いとか言われそうですが、脳が足りない私に知恵を分けて頂けませんか?
宜しくお願いします。
0101デフォルトの名無しさん2006/06/21(水) 11:08:00
>>100
いや、普通に投げられるよ
ウィンドウハンドルが間違ってるか、メッセージがフィルタリングされてるか、どっちかじゃない?
投げてるメッセージはWM_APP以降だよな?
■ このスレッドは過去ログ倉庫に格納されています