1 名前:デフォルトの名無しさん [2007/09/10(月) 12:20:27 ] 1 : ◆Manna2uCLg :2005/04/15(金) 13:33:14 Visual C++入門者・初心者からの質問を、 お兄ちゃん達が優しく、時には厳しく回答してくれるスレッドです。 ■質問するにあたって ・エラーや警告のときはエラーメッセージを書きましょう。 ・開発環境も書きましょう。 ・できるだけ具体的に。 質問の仕方については次のページが大変参考になります。 www.hyuki.com/writing/techask.html myu.daa.jp/osiete/ ■回答するにあたって ・回答する場合はその答えに至るための「コツ」も書いてあげると良いでしょう。 (MSDNのどの項目だとか、何のキーワードでGoogleするとか) ・ネタや煽りは軽く流しましょう。 過去スレ、関連スレなどは>>2-5 。
656 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 00:33:26 ] うは、声がきもい。 インデントが変態。 空白の明け方がへぼい。 思考の流れが行き当たりばったり。
657 名前:デフォルトの名無しさん [2007/11/10(土) 01:27:18 ] 面白そうなのでオレも見てみた。 インデントが変???ぜんぜん変じゃないんだけど・・・ っつう事で、>>656 がどんな立派なコードを書いてるのか、期待age
658 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 01:27:26 ] www.wisdomsoft.jp/dev/api/windows/004 の #include <windows.h> int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance , PSTR lpCmdLine , int nCmdShow ) { CHAR chStr[128]; wsprintf(chStr , "インスタンスハンドル : %d" , hInstance); MessageBox(NULL , chStr , TEXT("Kitty on your lap") , MB_OK); return 0; } が エラー 1 error C2664: 'wsprintfW' : 1 番目の引数を 'CHAR [128]' から 'LPWSTR' に変換できません。(新しい機能 ; ヘルプを参照) c:\documents and settings\gald.pc-p4gald\デスクトップ\sdaf4e\sdaf4e\asdf.cpp 7 エラー 2 error C2664: 'MessageBoxW' : 2 番目の引数を 'CHAR [128]' から 'LPCWSTR' に変換できません。(新しい機能 ; ヘルプを参照) c:\documents and settings\gald.pc-p4gald\デスクトップ\sdaf4e\sdaf4e\asdf.cpp 8 というエラーで実行できないんだけど なぜでございましょう? つか、VBやらC#の型はわかりやすいのに WCHARとかTCHERとかLPSTRとか理解しにくい型が多くて苦しい
659 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 01:31:08 ] >>658 エラー通りだな CHAR chStr[128]; を TCHAR chStr[128]; に変更すればいいんでない? それでエラーが出るなら、<tchar.h>をインクルードすればOK
660 名前:デフォルトの名無しさん [2007/11/10(土) 01:32:52 ] プロジェクトがユニコードになってるからだよ。 ANSIに変更しよう。 初心者がかならずつまづく超FAQだね。
661 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 01:42:19 ] 何回も同じ質問を見てるな テンプレにでも入れた方がいい気がする
662 名前:若者は馬鹿者 ◆KorX0HCHGU mailto:sage [2007/11/10(土) 01:43:24 ] >>659 #include <windows.h> #include <tchar.h> int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance , PSTR lpCmdLine , int nCmdShow ) { TCHAR chStr[128]; wsprintf(chStr , "インスタンスハンドル : %d" , hInstance); MessageBox(NULL , chStr , TEXT("Kitty on your lap") , MB_OK); return 0; } エラー 1 error C2664: 'wsprintfW' : 2 番目の引数を 'const char [26]' から 'LPCWSTR' に変換できません。(新しい機能 ; ヘルプを参照) だそうでつ >>660 プロジェクトのプロパティ-構成プロパティ-全般 の 文字セットを「Unicode文字セットを使用する」から「設定なし」にしたら 上記のコードが動いたわけですが、 これはソースコードそのものがUnicodeだったからダメだったってことでつか? 理由がよくわからんです
663 名前:デフォルトの名無しさん [2007/11/10(土) 02:01:46 ] >>662 ユニコードじゃ無いアプリケーションを、ユニコードアプリケーションとしてコンパイルしようとした。 www.wisdomsoft.jp/dev/api/windows/003 ここには「将来性を考えて、これから文字コードは Unicode を用いるべきです。 」とか書いてあるけど・・・ 初心者はユニコードアプリには手を出さんほうがいいよ。もうすこし慣れてからがいい。 よっぽど注意深くコーディングしないと、ワケワカランことになるよ。
664 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 02:03:43 ] >>662 _T("インスタンスハンドル : %d") とすれば、いいよ TCHARってのは、コンパイル時に自動で、マルチバイト文字セットとUNICODE文字セットを切り替えてくれます 文字リテラル("文字列"とか'a'とか)については、_Tもしくは、TEXTマクロで、マルチバイト文字セットとUNICODE文字セットの変更を自動でしてくるようになります ソースコードがUNICODEとか言うんじゃなく、現在扱っている文字が何なのかをコンパイラに教えてやる必要があるって事です それを省略したら、勝手に、ANSIとかOEMとか言う文字セットとして扱われるって事です
665 名前:デフォルトの名無しさん [2007/11/10(土) 03:09:35 ] 非ユニコードアプリとユニコードアプリの差をまず理解しないとだめってことでつね
666 名前:デフォルトの名無しさん [2007/11/10(土) 10:46:55 ] 今、ゲーム作ってるんですけど教えてください。(ゲ製作で聞くべき?) ゲームの画面を(ウィンドウが隠れたりしても)表示させるために WM_PAINTで BitBlt(hDC2,0,0,200,200,GetDC(hWnd),0,0,SRCCOPY); てな感じでhDC2に退避させて、ウィンドウが隠れたりして再表示する時に hDC2から持ってくる・・・という風にしたいんですが、 1.WM_PAINTの部分で画面を退避させるという事は変でしょうか? 「普通はこうやる」っていうのがあれば教えて頂きたい。 2.退避させた画面はどの部分(ハンドラ)で戻すべきですか? 今のところ、WM_TIMERで一定時間ごとに戻してるのですが・・・
667 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 10:56:55 ] 予めメモリDCを作っておいて、描画は全てそこへ行う。 WM_PAINTでは、そのメモリDCからウィンドウDCへのBitBltに限る。 ってのが普通。
668 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 11:32:26 ] >>667 いまどきそんな原始的な方法なんかw
669 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 11:38:55 ] でも666はありえないだろ。 話はそれるがReleaseDCしていないのも目に付くし。
670 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 18:42:02 ] >>657 void main() {
671 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 18:43:53 ] 夫失敬。 >>657 void main(){ while (1) { DrawMap(); } } -- 変態かどうかは兎も角、不思議なコーディングスタイルだとは思う。
672 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 00:32:33 ] めんどくせー > VC++ Formねーじゃん どうやってGUIつくんだよ
673 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 00:46:10 ] 珍しいVC++だね。ウチのにはForm付いてるよ。
674 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 00:56:55 ] うちのはintも付いてない
675 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 01:03:24 ] それVirtualConsoleだろ
676 名前:デフォルトの名無しさん [2007/11/11(日) 01:40:15 ] VC6.0でプログラムしています。 MFCは使わず、APIのみ。 ダイアログボックスにコンボボックスを貼り付けて 内容(数字)をリストから選択するような動作をさせたいと思っています。 ワードでフォントを変更するときのコンボボックスのようなイメージです。 VC上でダイアログボックスにコンボボックスを貼り付け、 コンボボックスのプロパティのデータ にある”リストボックス項目の入力(N)”に 選択したい数字のリストを並べれば良いかと思ったのですが 実際に動かしてみると コンボボックスの▼を押してもキーボードの↓を押しても リストが現れません。 やり方が間違っているでしょうか? 関係ないかもしれませんが手元の参考書ではリストボックスを使用する場合の方法が書いてあり リストボックスを初期化するにはSendDlgItemMessage()関数を使用するとのことだったので 試しにやってみましたがリストボックスではリストに文字列を追加できましたがコンボボックスでは追加されませんでした。 内容に不足などありましたらご指摘をお願いします。
677 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 05:28:25 ] >コンボボックスの▼を押してもキーボードの↓を押しても >リストが現れません。 ああこれね
678 名前:676 [2007/11/11(日) 07:36:53 ] >>677 おはようございます。 良くある質問でしょうか? 申し訳ないですが質問内容が間違ってました。 ▼ボタンを押すとドロップダウンリストは出ます。 しかし、中が空っぽです。 リソースエディタで入力した内容を反映させたいのですが。
679 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 08:28:15 ] 早まって答えなくてよかった >リストボックスではリストに文字列を追加できましたがコンボボックスでは追加されませんでした 問題はこれか
680 名前:96 [2007/11/11(日) 09:14:14 ] リソースエディタのコンボボックスまわりの内容はこんな感じです // Dialog // IDD_CONFIG DIALOG DISCARDABLE 125, 110, 194, 95 STYLE DS_SYSMODAL | DS_SETFOREGROUND | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CAPTION CAPTION "CONFIG" FONT 9, "MS Pゴシック" BEGIN LTEXT "コンボボックスで値を選択してください",IDC_STATIC,7,19,77,8 PUSHBUTTON "OK",IDC_CONFIG_OK,133,14,26,15 COMBOBOX IDC_COMBO2,86,16,46,71,CBS_DROPDOWNLIST | CBS_NOINTEGRALHEIGHT | WS_TABSTOP END // Dialog Info // IDD_CONFIG DLGINIT BEGIN ←コンボボックスのリストに表示したい値(1〜20の数字) IDC_COMBO2, 0x403, 2, 0 0x0031, IDC_COMBO2, 0x403, 2, 0 〜〜〜〜省略〜〜〜〜〜〜〜〜 IDC_COMBO2, 0x403, 3, 0 0x3931, "\000" IDC_COMBO2, 0x403, 3, 0 0x3032, "\000" 0 END
681 名前:676=680 mailto:sage [2007/11/11(日) 09:15:52 ] 名前欄ミスしました。
682 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 09:31:42 ] リソースレベルでコンボボックスのデータを定義できるのはMFCの独自機能。 リソースビューの*.rcを選んでプロパティを見てもらえば分かるが、 'Mfc Mode'という項目が用意されている。 これをFalseにすると、コンボボックスのプロパティでData部分が無効になる。
683 名前:676 mailto:sage [2007/11/11(日) 13:38:36 ] >>682 なるほどそういうことでしたか。 ありがとうございます。 リストの値をSendDlgItemMessage()関数で追加できないと書きましたが 参考書で引数に LB_ADDSTRING を指定しているところで CB_ADDSTRING を指定するようにしたところリストに追加できました。 ありがとうございました。
684 名前:デフォルトの名無しさん [2007/11/11(日) 15:40:55 ] 質問させてください。 Visual C++ .net 2005で開発を行っています。 フォーム(Form1)やピクチャボックス(pictureBox1)に簡単なグラフを表示させたいのですが、 button1_Click等で描画すると、一度非表示になった部分の線が消えてしまいます。 Form1_Paintイベント内で描画すれば解決するのですが、毎回データを読み込んだり計算するのが 無駄に感じます。 Form1で非表示になった部分を消さないための方法はあるのでしょうか? または、なんらかのバッファに描画して、それをForm1_Paint内で毎回読み出すという方法のほうがいいのでしょうか? そのための方法等があれば教えてください。 よろしくお願いします。
685 名前:684 mailto:sage [2007/11/11(日) 15:44:04 ] 補足 線は、 Graphics^ gr = pictureBox1->CreateGraphics(); Pen^ pen1 = gcnew Pen(Color::Black,2); gr->DrawLine(pen1,10,10,200,200); こんな感じで書いています。
686 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 22:25:30 ] >>684 Imageに描いて、Paintイベントでgr->DrawImage
687 名前:648 mailto:sage [2007/11/12(月) 00:13:47 ] >686 なるほど、ありがとうございます。 Bitmapをバッファとして使い、Graphics::FromImageで取り込んだイメージに対して、 描画を行いました。おかげでうまくいきました。 ↓みたいな感じでよろしいでしょうか? 何か改善点があればご指摘お願いします。 Bitmap^ bmap1; private: System::Void mnDraw_Click(System::Object^ sender, System::EventArgs^ e) { Pen^ pen1 = gcnew Pen(Color::Black,2); Graphics^ gr1 = Graphics::FromImage(bmap1); gr1->DrawLine(pen1,10,10,100,100); // gr1->Dispose(); //なぜかエラーになる Form1::Refresh(); } private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) { bmap1 = gcnew Bitmap(200,200); } private: System::Void Form1_Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e) { e->Graphics->DrawImage(bmap1,100,100,200,200); }
688 名前:デフォルトの名無しさん [2007/11/12(月) 00:15:57 ] >>687 Bitmap^ の 「^ 」 ってどういう意味?
689 名前:若者は馬鹿者 ◆KorX0HCHGU mailto:sage [2007/11/12(月) 00:16:21 ] Win32アプリ開発で VSの出力の部分にウインドウメッセージを表示したいのですが .netでいうSystem.Diagnostics.Debug.Printに相当する機能はないですか?
690 名前:デフォルトの名無しさん [2007/11/12(月) 00:18:17 ] >>689 ドットネットの質問は他所でやれ馬鹿者!
691 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 00:24:38 ] >>690 には>>689 が”ドットネットの質問”に見えるらしいw
692 名前:684 mailto:sage [2007/11/12(月) 01:09:01 ] >688 自動でガーベージコレクションをやってくれるようです。ようは、使い終わったら勝手にメモリを開放してくれるらしい。
693 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 03:14:25 ] >>692 なるほどー 2005からの機能ですね
694 名前:デフォルトの名無しさん [2007/11/12(月) 08:44:30 ] win32APIで虫眼鏡のプログラムを作ってます。 メモリデバイスコンテキストでマウスカーソル周辺を拡大したものを ディスプレイのデバイスコンテキストに転送してるんですが、 マウスを移動させたときに先ほど拡大した部分を元に戻して 移動先のマウスカーソル周辺をまた拡大という風にしたいんです。 ですが、毎回GetDC(0)をしたとしても拡大した後のディスプレイでは初期化できないし、 hdc2という二つ目のデバイスコンテキストに拡大前の状態を退避させて hdc1に復活させようと思ったのですがうまくいきません。 さらに、メニューを開いたり新たにソフトを起動させたりと、 刻々と変化するディスプレイの状態を追いかけつつ拡大できるようにしたいのです。 探し方が悪いのかもしれませんが、 いろいろ検索しましたが良い解決法が見つかりませんでした。 それに虫眼鏡のプログラミングを解説してるサイトもなさげだし・・・。 このような場合、どのような方法を用いればいいのでしょうか? よろしくお願いします。
695 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 09:49:55 ] MSDNのサンプルじゃダメなの? /****************************** Module Header ******************************* * Module Name: zoomin.c * * Microsoft ZoomIn utility. This tool magnifies a portion of the screen, * allowing you to see things at a pixel level. * * History: * 01/01/88 Created. * 01/01/92 Ported to NT. * 03/06/92 Cleanup. * ****************************************************************************/
696 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 10:35:31 ] 一応 .netを使ったC++/CLI は、普通のC++とは全く別物 .net使いたいならC#がいいと思う
697 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 12:45:26 ] argcとargvについて教えてください。
698 名前:694 mailto:sage [2007/11/12(月) 13:27:05 ] >>695 そのページってどこを探したらありますかね? MSDNのサイト調べても見あたらなかったんですが…。 教えて君で申し訳ありません。
699 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 16:26:41 ] >>698 Platform SDKはインストールしてる?
700 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 17:51:17 ] Visual Studio 2005を使って、DirectXプログラムを作ろうとしてます。 ちなみにOSはWindowsXP Home Editionです。 ネット上の解説サイトで、Visual C++ Express Editionを使って Windowsアプリケーションを作成する場合にはPlatform SDKが必要と書いてあるんですが、 Visual Studio 2005を使う際にもPlatform SDKをインストールしておいたほうが良いでしょうか?
701 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 17:58:14 ] 今ならPlatform SDKよりWindows SDKお勧め。 DirectXには、DirectX SDKが必要。 ただし、DirectShowには上2つの内どちらかが必要。
702 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 18:04:12 ] >>701 ありがとうございます。 DirectShowが何かよくわかりませんが、 解説本がPlatform SDKで進めているので、 これとDirectX SDKでやってみます。
703 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 18:20:49 ] VisualC++ Expressでプログラム製作をしています。 プログラム実行中にコードを書き換えてAlt+F9を押すと、動的にプログラム の内容を変えてくれますが、ボタンを押しても出来ない時があります。 これは何が原因なのでしょうか?
704 名前:700 mailto:sage [2007/11/12(月) 20:24:35 ] 度々すみません。 DirectXのテストをしようと、 D:\Program Files\Microsoft DirectX SDK (November 2007)\Samples\C++\Direct3D\Tutorials\Tut01_CreateDevice\CreateDevice.cpp を自分のプロジェクトフォルダにコピー、既存の項目を追加して、 ソリューションのビルドをしてみると以下のエラーが出ました。 CreateDevice.obj : error LNK2019: 未解決の外部シンボル _Direct3DCreate9@4 が関数 "long __cdecl InitD3D(struct HWND__ *)" (?InitD3D@@YAJPAUHWND__@@@Z) で参照されました。 C:\Documents and Settings\(ユーザ名)\My Documents\Visual Studio 2005\Projects\d3dtest01\Debug\d3dtest01.exe : fatal error LNK1120: 外部参照 1 が未解決です。 そこで、Direct3DCreate9を含む「d3d9.lib」をプロジェクト名→プロパティ→リンカ→入力の「既存の依存ファイル」に追加したのですが、 まだ同じエラーが起こります。 D:\Program Files\Microsoft Platform SDK\Bin/Lib/Includeのパスは追加したのですが、 他に何が原因なんでしょうか?