★初心者にVisual C++を教えるスレ★ Part23
>>951 まだやってましたか!大分小さくなりましたね
struct {} a;はC言語の基礎中の基礎ですね
WindowStyleにWS_OVERLAPPEDWINDOW|WS_VISIZBLEもSDKだと基本ですね
showwindowに戻り値があることもすっかり忘れてました
いい勉強になりました
それがC++では、型の宣言と同時に変数や関数の宣言ができなくなっていたような気がしたんだ。
Visual Studio C++ 2005 Express EditionでC/C++の勉強をするとしたら、
お勧めの書籍はありますか?Visual Studioを使うのはこれが初めてです。
本当にC/C++の勉強?
MFCとかDirectXとか.NETとかのC++以外の部分じゃなくて?
本当にC++なら「プログラミング言語C++ 第三版」で鉄板。
>>955 レスありがとうございます。
C++の言語部分はおっしゃる書籍を使おうと思っているのですが、
Visual Studio自体の使い方(デバッカなど)で分かりやすい
お勧めがあればなぁ、と。
そこまで初心者なら本じゃなくて学習ソフトでも使ったら?
なるほど学習ソフトですか。調べてみます。Thx。
for の初期化部分で二つ以上の変数を宣言 & 初期化したいのですが。
for 中でしか必要のない変数を for 文のスコープ外で見せたくないので。
for 文の外で宣言してさらにそれをブロックで囲めとかですか?普通。
カンマ
>>960 二つ以上の変数の型が違うのです。
for の中で unsigned 一つと char 一つ使いたいので。
教えてやるんじゃなかった
Cスレで聞け
> 普通
適切な変数名をつければ(そしてコードが長ければ適切に関数に分けていけば)
for の外で宣言しても混乱なくコードが書けると思いますぜ。
== 外で宣言しても気にしない。
まぁ 「普通」 なんて人によって違ってくるから1つの意見として。
ブロック作ればいいじゃん
GDI+ と、libpngで、PNGファイルを作成しましたが、
圧縮後のファイルサイズを比較したところ、
libpngの方がかなり小さくなります。
libpng は、圧縮レベルを設定できるのですが、
GDI+では、該当するパラメータを見つけられません。
本当は、GDI+で楽をしたいので、
GDI+での圧縮レベルの設定法を教えてください。
ちなみに、テストに使用しているのは、デスクトップを
キャプチャした画像です。
>>965 pngの圧縮レベルはサイズに余り影響しないと思うのだけどね。
もしや、GDI+は32ビットカラー、libpngは8ビットカラーなんてことはない?
メタデータが含まれてたりとかな
968 :
965:2006/09/07(木) 07:45:04
>>966 出来上がったファイルを右クリックしてプロパティで
確認した限りでは、両方とも8ビットカラーと表示されてます。
圧縮後のサイズは1割程度の差がつくようです。
GDI+使用時 45k
libpng使用時 39k
>>967 メタデータは意識していませんでした。
確認してみます。
969 :
デフォルトの名無しさん:2006/09/07(木) 17:23:56
ダイアログベースのソフトを作っています.
ボタンやコンボ,picture boxを配置しています.
いま,矢印キーを押すと,pictureに表示している内容を変えたいと思っています.
OnKeyDown(nChar ,...)で
if(nChar == 0x025) hogehoge();
としていますが,これではhogehogeが呼び出されません.
ボタンへのフォーカスが動くだけです.
どうしたら,hogehogeを呼び出すことができるのでしょうか?
>>969 PreTranslateMessage()で拾ってみたら?
971 :
969:2006/09/07(木) 18:41:23
できました! ありがとうございました
972 :
デフォルトの名無しさん:2006/09/08(金) 18:39:58
質問させてください
Escapeキー→プログラムを終了
Tabキー→ボタンのフォーカス移動
の両立がしたいのですが、うまくいきません
現在、ウィンドウクラスをwc.cbWndExtra = DLGWINDOWEXTRAにして
CreateWindowで作ったトップウィンドウにボタンを2個配置しています
メッセージループで
while (GetMessage(&msg, NULL, 0, 0)) {
if(!IsDialogMessage(hWnd,&msg)){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
このように記述するとフォーカス移動はできますがESCAPEはうまく動かず
逆にisDialogMessageの記述をなくすとESCAPEはOKですが
フォーカス移動がダメという状態です
メッセージループの書き方が悪いような気がするのですが
そもそも作り方自体が変なのでしょうか
猫にでも行ってメッセージループについてが上のほうに書いてあるよ
自分でmsgの中味みりゃいい
975 :
972:2006/09/08(金) 19:38:26
>>973,974
回答ありがとうございます
一応、各関数については調べました
msgの中身の見方というのは良くわからないのですが
while (GetMessage(&msg, NULL, 0, 0)) {
if(msg.message==WM_KEYDOWN){
if(msg.wParam==VK_ESCAPE)
MessageBox(NULL,"vkescape","",MB_OK);
}
if(!IsDialogMessage(hWnd,&msg)){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
こういったプログラムを実行してみたところ
VK_ESCAPEの入力自体はあるようです
ちょっと、質問の仕方が下手だったので整理して
もう一度質問質問させてもらいます
976 :
972:2006/09/08(金) 19:52:58
972のプログラムのhWndは、
猫でもわかるプログラミングののSDK編のイントロダクションのサンプルで
wc.cbWndExtraの値を0からDLGWINDOWEXTRAにだけ変更して作成したウィンドウの
ウィンドウハンドルです
そして
CreateWindow(
TEXT("BUTTON") , TEXT("ボタン1") ,
WS_CHILD | WS_VISIBLE | WS_BORDER| WS_TABSTOP|BS_PUSHBUTTON ,
0 , 0 , 0 , 0 ,hWnd , (HMENU)100 , hInstance , NULL);
こういう感じでボタンを2つ配置しているのですが
メインのhWndをダイアログかつ、通常のウィンドウとして
扱うのは変だろうかというのが疑問点です
つまり、プログラムとしては
リソーススクリプトを作ってそこにボタンを配置して
CreateDialogでhWndを親とするダイアログをつくり
while (GetMessage(&msg, NULL, 0, 0)) {
if(!IsDialogMessage(hWndDialog,&msg)) //←hWndからhWndDialogに
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
こういうループにしたほうが良いでしょうか
977 :
972:2006/09/08(金) 20:19:44
すみません、解決しました^^;
メッセージ処理はメッセージループの中でしなければだめと
思い込んでいました
while (GetMessage(&msg, NULL, 0, 0)) {
if(msg.message==WM_KEYDOWN){
if(msg.wParam==VK_ESCAPE){
PostQuitMessage(0);
}
}
if(!IsDialogMessage(hWnd,&msg)){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
978 :
デフォルトの名無しさん:2006/09/08(金) 23:50:51
MFCで同じようなダイアログを複数作ろうと思っています。
共通の処理は一つにまとめたいので、CDialogを継承した
自前のクラスを作り(CMyDialogとします)、このCMyDialogを
継承してそれぞれのダイアログに対応したクラスを作りたいと
考えています。
しかし、クラスウィザードでダイアログに対応したクラスを作ろうと
すると、”MFCクラス”しか選べず、自前のクラスは選べません。
この様にCDialogをそのまま使わずに継承してから使いたい
場合はどうすればいいのでしょうか?
どうでもいいけどそのメッセージループやめれ。推奨されてない。
>>978 クラスウィザードで作った後、自前で変えることは可能だが。
>>980 そうなんですか?
クラスウィザードでとりあえずCDialogベースに作っておいて、その後に
手動編集で自前のクラスを継承させてもそのまま使えるのでしょうか?
その場合、編集するのは
Class MyClass : public CDialog
のCDialogを書き換えるだけで良いのでしょうか?
また、その後にクラスウィザードでメッセージ対応させた関数を作っても
そのまま使えるのでしょうか?
982 :
972:2006/09/09(土) 02:30:55
>>981 他にもいくつか書き換える場所あるよ。メッセージマップとか。
>>981 >while (GetMessage(&msg, NULL, 0, 0)) {
ここじゃね?
エラー発生時に-1を返すとかだっけ?
GetMessageをMSDNで調べてみな。
985 :
972:2006/09/09(土) 15:46:28
>>984 多分私へのレスですよね?
MSDNにはGetMessageはWM_QUITのときのみ0
エラーが出たときは-1を返すと書いてありました
WEBにあるメッセージループはほとんどwhile(GetMessage)の形式なので
全く気づきませんでした!とても参考になりました
こんな感じに書き直してみました
int getmessage_return_value;
while(TRUE){
Getmessage_return_value=GetMessage(&msg,NULL,0,0);
if(getmessage_return_value!=0 && getmessage_return_value!=-1){
if(msg.message==WM_KEYDOWN&&msg.wParam==VK_ESCAPE)
PostQuitMessage(0);
if(!IsDialogMessage(hWnd,&msg)){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
else{
break;
}
}
986 :
デフォルトの名無しさん:2006/09/09(土) 23:30:34
プログラムって英語とか数学とか分かってないときついですか?
誰か教えてください
英語
マニュアルを読む際に日本語のものが無いまたは役に立たない場合など
英語のソースにあたることが多いので英語力は無いよりはあった方が有利
数学
基本的には論理的思考が出来れば良い
開発にかかわるプログラムの内容によっては数学の知識や物理の知識が必要
>>986 数学は分野によるのでは?
英語は分かるにこした事はないけど、普通に書く分には簡単な単語が分かれば十分でしょ。
あとプログラム書いてて思ったのは、文章の構成能力というか、
文章を纏めるのが上手い人が書いたプログラムってのは凄く読みやすいと思ったよ。
989 :
デフォルトの名無しさん:2006/09/09(土) 23:54:58
ネタ抜きで俺九九とか割り算までしか出来ないんですけど
プログラム組めますか?
計算はCPUがやってくれるから
>>989 ==
>>986 かな?
英語や数学うんぬん言う前に
ひとの意見に耳を傾ける能力も必要だよ
>>989 マジレスすると、計算が苦手でも式さえ考える力があれば
計算系のプログラムもある程度は書けると思うよ。
計算するのはコンピュータだからね。
まぁ要は君の頑張り次第じゃないのかな?
まだ若いのなら今から色々本見るなり、ネットで調べるなりして頑張って勉強するといいよ。
次スレいらないよね?
というより、「プログラミングがやりたい!」って思って
本当に好きなら、誰がなんと言おうが頭が悪かろうがその気持ちを抑えられないでしょ、普通。
おれなんかは、決して頭も良くないし、プログラムもあまり上手くないと思うけど
凄く好きだから今だにやってるし、初めてコンソールで「Hello World!」って出した時なんか
言葉では言い表せない様な衝撃が身体に走ったけどな。好きならそんなもんでしょ?
995 :
デフォルトの名無しさん:2006/09/10(日) 00:26:18
>>988 そうですかー学校でCの学習がはじまるんで
どうなんだろうと思いました。ありがとうございます。
とりあえず、英語は単語程度ならある程度分かるので頑張ってみます
>>991 自分
>>986です。
>>989は別の方ですね
996 :
デフォルトの名無しさん:2006/09/10(日) 00:26:54
ここでいう若いんだったらって何歳くらいのことなの?20歳くらい?
始めるのに年齢は関係ないよ
やる気の問題
ただ年取ってくると日常の雑務に煩わされて
だんだん遊んでる時間なくなってくるけどね
999 :
デフォルトの名無しさん:2006/09/10(日) 00:33:27
プログラムが書けるというのは「○○語がしゃべれるようになる」
「○○語が書けるようになる」「筆が使えるようになる」
というのと同じようなもので、何を書くか、ということとは別問題。
1000 :
デフォルトの名無しさん:2006/09/10(日) 00:36:47
1000ならチンコ切断
1001 :
1001:
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。