★初心者にVisual C++を教えるスレ★ Part10

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
Visual C++入門者・初心者からの質問を、
お兄ちゃん達が優しく、時には厳しく回答してくれるスレッドです。

■質問するにあたって
・エラーや警告のときはエラーメッセージを書きましょう。
・開発環境も書きましょう。
・できるだけ具体的に。

  質問の仕方については次のページが大変参考になります。
  http://www.hyuki.com/writing/techask.html
  http://www.geocities.co.jp/Beautycare/4965/public/template.html

■回答するにあたって
・回答する場合はその答えに至るための「コツ」も書いてあげると良いでしょう。
 (MSDNのどの項目だとか、何のキーワードでGoogleするとか)
・ネタや煽りは軽く流しましょう。
2デフォルトの名無しさん:04/01/24 17:45
31:04/01/24 17:47
前スレの 1-2 に、前スレへのリンクを足しただけですが
こちらのほうでよろしかったでしょうか。
新スレ乙。
VCが無駄にしてるメモリ領域ってなんですか?
完全な最適化をしきれていない分のコードが締めるメモリとか?
使ってない機能はリンクされないんだからヘッダをいじっても
何も変わらないと思うんだけど、具体的に何がどうなるの?
>>5は前スレの991のレスに対する疑問かね
------------------------------------------------------
991 名前:デフォルトの名無しさん[sage] 投稿日:04/01/24 13:46
そこまで大きいメモリを連続して取るなら、
アッセンブラを多少勉強したほうがいい、
なぜ個体によって動いたり動かなかったり、
完全に動かすにはどうやるのかわかるよ。
どのレジスタにどの情報を入れるかはっきりと指定できるからな。
ただし、何メガもアッセンブラでやることは無いと思うが。
そもそも16Mや配列1マン取らないといけない設計自体に
疑問を感じる。

VCはただでさえ無駄にメモリ領域を消費している。
ヘッダや元からついてくるソースに入っていって使ってない機能を
削除するとか、いろいろ方法も考えられる。

VCはふつうのソフトの開発やデバッグややりやすいが、いったんデバイス(メモリ)
で引っかかったら、永久に原因が究明できないのが大欠点。

C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
>8
StdAfx.hをインクルードしてないんじゃない?
10デフォルトの名無しさん:04/01/25 11:24
前スレの最後でも質問させていただいたのですが、
文字列リソースを使用するうえで、個数の上限、又は
総バイト数の上限などはあるのでしょうか?
まったくわからなくて困っています。
古いスタイルのオープンダイアログにおいて(OFN_ALLOWMULTISELECTをしていするオープンダイアログ)
右側にあるディレクトリを選択するツリービューを作成するにはどのようにすればいいのでしょうか。
ツリービューで自作しようと試みたのですが、あそこまで快適なものをつくるには私はあまりにもスキル不足でした。
なにとぞご指導お願いします。
12デフォルトの名無しさん:04/01/25 19:07

一般のCView派生クラスにSetFont って無効なんですかね?
SetFontしてGetFontしてもNullポインタが返ってくるんですが。

OnDrawの中で毎回、LOGFONTからCFontを作成して
SelectObjectをやってますけど。

13デフォルトの名無しさん:04/01/25 19:10
>>11
CFileDialog?

ツリービューなんてあったっけ?
リストビューじゃなくて?
14デフォルトの名無しさん:04/01/25 19:22
質問です。
ビューの中にボタン(CButton)を配置して、
ボタンがクリックされたとき、メッセージをCButtonじゃなくて、
その親ビューが受け取るようにすることはできるんでしょうか?

CButtonの派生クラスを作らないで実現したいのですが。
普通ボタンが押されたときのメッセージってのは親に飛ぶものだが。
クリックされたときボタンを押されたくないとか複雑な事情か?
16デフォルトの名無しさん:04/01/25 19:28
>>12
ちょっと分かりにくかったかも知れないですが、
GetFont で CFont* を入手できないので

>OnDrawの中で毎回、LOGFONTからCFontを作成して
>SelectObjectをやってますけど。

でやっているということです。

SetFont が 毎回取得するデバイスコンテキストに
影響を与えるとするなら、一度 SetFont すれば
SelectObjectは不要なのでしょうが、実際には
何も表示されるフォントに変化がないので、毎回
OnDraw でpDC->SelectObjectをやってから描画して、
また元のフォントに戻している状況です。
>>14
押されたボタンのメッセージはデフォルトで
親に伝えられてるはずだよ。ボタンの解説書を
読むといいと思う。
>>13
適当にボタンを作って
void CTESTDlg::OnButton1()
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
OPENFILENAME ofn;
char fn[MAX_PATH];
int r;
fn[0] = '\0';
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.Flags = OFN_ALLOWMULTISELECT;
ofn.lpstrFile = fn;
ofn.nMaxFile = sizeof(fn);
r = GetOpenFileName(&ofn);
}
でボタンを押すと出てくるダイアログです。
1911:04/01/25 20:43
ちなみに自作で作ってみたのが以下のものです。
ちらつきが激しくてストレスがたまってしまいました。

// lpszDirPath:カレントディレクトリのフルパスです。
// m_dirtree:CTreeCtrlのコントロールを指すメンバ変数です。

void CTestDlg::SetTreeView(LPCTSTR lpszDirPath)
{
      TCHAR lpPath[_MAX_PATH+1];
      _tcscpy(lpPath, lpszDirPath);

      ULONG uJudge;
2011:04/01/25 20:44
      TCHAR lpDirectoryPath[_MAX_PATH+1];
      TCHAR lpExtension[_MAX_EXT+1];
      
      TCHAR lpDrive[_MAX_DRIVE+1];
      TCHAR lpDir[_MAX_DIR+1];
      TCHAR lpFname[_MAX_FNAME+1];

      CString csFileName = _T("");

      CStringArray csaTreeItem;
      HTREEITEM htiTreeItem[65535];
      CString csBuf;
      long iItem = 0;
      long ulCount;
2111:04/01/25 20:46
      uJudge = (ULONG)GetFileAttributes(lpPath);
      if((uJudge & FILE_ATTRIBUTE_OFFLINE) ||
            !(uJudge & FILE_ATTRIBUTE_DIRECTORY)) {
            // ★★★ ここにエラー処理 ★★★
            // lpPathの示すフルパスが予想外のものである
            // 強制的にlpPathをカレントディレクトリにする
            if(!(GetModuleFileName(NULL, lpPath, sizeof(lpPath)))) {
                  // ★★★ ここにエラー処理 ★★★
                  // 自分のフルパス取得に失敗
2211:04/01/25 20:47
            } else {
                  _tsplitpath(lpPath, lpDrive, lpDir, lpFname, lpExtension);

                  _tcscpy(lpDirectoryPath, lpDrive);
                  _tcscat(lpDirectoryPath, lpDir);

                  csFileName.Format("%s%s", lpFname, lpExtension);
            }
2311:04/01/25 20:48
      } else {
            _tsplitpath(lpPath, lpDrive, lpDir, lpFname, lpExtension);

            _tcscpy(lpDirectoryPath, lpPath);
      }
      // lpDirectoryPath : ディレクトリパス
      // lpDrive : 上のディレクトリのドライブ
      PathSplit(lpDirectoryPath, csaTreeItem);

      if(m_dirtree.DeleteAllItems() == 0) {
            // ★★★ ここにエラー処理 ★★★
            // TreeViewのItemの削除に失敗
2411:04/01/25 20:49
      } else {
            htiTreeItem[0] = m_dirtree.InsertItem(csaTreeItem.GetAt(0), 0, 1);
            ulCount = csaTreeItem.GetSize() - 1;


            for(iItem = 0; iItem < ulCount; iItem++) {
                  csBuf = csaTreeItem.GetAt(iItem+1);
                  if(!csBuf.IsEmpty()) {
                        htiTreeItem[iItem+1] = m_dirtree.InsertItem(csBuf, 0, 1, htiTreeItem[iItem]);
                  }
            }
      }
2511:04/01/25 20:50
      CStringArray csaChildDir;
      CStringArray csaChildFile;
      int iChildDirSize;
      int iChildFileSize;

      GetChildren(lpDirectoryPath, csaChildDir, csaChildFile);
      iChildDirSize = csaChildDir.GetSize();
      iChildFileSize = csaChildFile.GetSize();

      if(iChildDirSize >= 1) {
            for(iItem = 0; iItem < iChildDirSize; iItem++) {
                  csBuf = csaChildDir.GetAt(iItem);
2611:04/01/25 20:51
                  if(!csBuf.IsEmpty()) {
                        m_dirtree.InsertItem(csBuf, 0, 1, htiTreeItem[ulCount]);
                  }
            }
            m_dirtree.SortChildren(htiTreeItem[ulCount]);
            m_dirtree.SelectItem(htiTreeItem[ulCount]);
            m_dirtree.Expand(htiTreeItem[ulCount], TVE_EXPAND);
            m_dirtree.Select(htiTreeItem[ulCount], TVGN_FIRSTVISIBLE);
      } else {
            m_dirtree.SelectItem(htiTreeItem[ulCount]);
            m_dirtree.Select(htiTreeItem[ulCount], TVGN_FIRSTVISIBLE);
      }
}
2711:04/01/25 20:52
// PathSplit
// たとえばlpPathが C:\hogehoge\alpha\test としたときに
// csaArrayに順番に C: hogehoge alpha test と配列に格納します

void CTestDlg::PathSplit(LPCTSTR lpPath, CStringArray &csaArray)
{
      CString csPath;
      csPath.Format("%s", lpPath);
      int iPos = 0;
      CString csSep;
      CString csItem;
      CString csBuf;
2811:04/01/25 20:52
      if(csPath.Find(_T("\\\\"), 0) != -1) {
            // 共有ディレクトリパスの処理

      } else {
            csSep = _T("\\");
      }

      do {
            iPos = csPath.Find(csSep, 0);

            if(iPos != -1) {
                  csItem = csPath.Left(iPos);
                  if(!csItem.IsEmpty()) {
                        csaArray.Add(csItem);
                  }
                  csBuf = csPath.Mid(iPos + csSep.GetLength());
                  csPath = csBuf;
            }
      } while(iPos != -1);

      
      if(!csPath.IsEmpty()) {
            csaArray.Add(csPath);
      }
}
2911:04/01/25 21:05
>>19-28
以上をウィンドウにファイルやディレクトリをD&Dしたときに
ディレクトリパスを取り出し、そのパスを引数にSetTreeViewを呼び出しているのですが
呼び出す事にツリービュー内が激しくちらつきます。
また読み込むスピードも遅いです。
改良できるならこれを改良したいのですが知恵を貸してください。

ファイル開くダイアログってリストビューだと思うんだけど、
何をしようとしているのか分からん。
ディレクトリを選択するダイアログなら、IEのコンポーネント
あたりのものを利用する方法があるよ。
31デフォルトの名無しさん:04/01/25 21:59
ろくにレスをみないでカキコですが
ttp://www.athomejp.com/goldfish/api/browsefolder.asp
このへんとかどうよ
32デフォルトの名無しさん:04/01/25 22:08
アプリケーション(親)
+MinimapView(子)
http://www.42ch.net/UploaderSmall/source/1075035501.JPG

の2つのウィンドウを同じスタイルWS_OVERLAPPEDWINDOWを使用し
CreateWindowEx関数でウィンドウの表示はできたのですが、
親ウィンドウをクリックしても画像のように
子が上にきて、親が手前に表示されません。
親を手間に表示したいのですが、どのような方法があるのでしょうか?
アドバイスお願いします。

それにしてもソースを交換して議論できる
掲示板ってないんですかね?
ここではソースにインデントも付かないし、
使いにくすぎる。
>>32
子ウインドウなら、親ウインドウのクライアント領域を離れて
表示されることはないと思うのだが。
デスクトップの子ウインドウとして作れば?
3732:04/01/25 22:38
親 hwndParent = CreateWindowEx( 0... 0 ... );
子 hwndSub = CreateWindowEx( 0... hwndParent ... );
これで別々のウィンドウを作ってます。
おそらくMDIのことかと思いますが、
私がやりたいのは モードレスダイアログボックスのように、
メインウィンドウとサブウィンドウを別々に処理を行いたいのです。
MDIだとメインウィンドウの外にでれないので、不便なのです。
>>35
サンクス。今度使わせてもらいます。
3932:04/01/25 22:47
親 hwndParent = CreateWindowEx( 0... HWND_DESKTOP ... );
子 hwndSub = CreateWindowEx( 0... HWND_DESKTOP ... );
これでウィンドウの切り替えがうまくできました。
ありがとうございました。

しかし 問題のHWND_DESKTOPの部分は描画関係のハンドルなのかな?
うーむ 色々やってみます。どうもでした。
>>37
親ウインドウをNULLにして、ウインドウを作成したらどう?
俺はメインウインドウの外に置くウインドウは
これで作成してるよ。
VC++わっかんないぃぃぃーーーーー!うあーーーーーーん!
処理どこに書いたらいいかわっかんないぃぃぃぃいーーーーええーーーん!!!
lpShellFolder->GetAttributesOf(1, &lpItem, &ulAttrs);
この行をビルドしたら
C:\WINDOWS\デスクトップ\VC++\debug_build\FileView.cpp(215) : error C2664: 'GetAttributesOf' : 2 番目の引数を
                     'struct _ITEMIDLIST ** ' から 'const struct _ITEMIDLIST ** ' に変換できません。
変換で修飾子が失われます。
と出ました。どうしたらよいですか?
>>42
lpItemの宣言に const をつけてみたらどお?
>>43
違うところでエラーが出てしました・・・。某所で

constを付加するのですから,
const_castを使ってターゲットの型である,
LPCITEMIDLIST *にキャストしてやればよいです。

と書いてあったんですが
lpShellFolder->GetAttributesOf(1, (LPCITEMIDLIST)&lpItem, &ulAttrs);
とするのではないのですか?
>>44
それでうまく行った?

C++なんだから

lpShellFolder->GetAttributesOf(1,
&const_cast<LPCITEMIDLIST>(lpItem), &ulAttrs);

とするのがbetterな気がする。
子ダイアログから、親ダイアログのチェックボックスを
直接いじる方法教えて下さい。

SendMessage()を使えば出来るであろうと思ってますが、
親ハンドルの取得方法が良く分かっていないのと、
どのように投げたらいいか分かりません。
よろしくお願いします。
>>46
BM_SETCHECKをSendMessageしたいんだと思うが↓の方が簡単。

GetParent()->CheckDlgButton( nIDCheck, nCheck );
HWND使うんなら適当に読み替えてちょ。
4846:04/01/27 02:52
>>47
ありがとうございます。早速今日試してみます。

ちなみにSendMessage()は、USER_MESSAGEを投げて、
力技でなんとかしようと思ってますた。
VC++は知らないテクがあると、簡単な?ことが非常に
面倒で困りまつ。
49デフォルトの名無しさん:04/01/27 04:32

メインウインドウの外側に常時配置するモードレスダイアログ
を作成するのに、CDialog派生クラスを使いました。
それで、そのダイアログテンプレートにはエディットボックス
を配置しました。

実際に実行してエディットボックス内部でリターンを押すと
ダイアログも消えてしまうんです。どうもモーダルダイアログ
の際のIDOKを返すのと同じ処理が行われているんじゃないかと
推察するのですが、これ、リターン押しても消えないように
するには、どうしたらいいんでしょうか?
50デフォルトの名無しさん:04/01/27 04:45
>>49
自己解決しますた。
CDialogのOnOK()をオーバーライドして、
何も処理しなかったら、消えないように
なりますた。

これはVC++の仮想関数の追加では表示
されなかったんですが、こういう関数も
時々ありますね。ちと紛らわしい。
51デフォルトの名無しさん:04/01/27 12:43
RSAなどの暗号処理をVC++で実装しようと思ったら
自分でコーディングするか、javaや.netframework使うしかないの?
別にopensllもVCで使えるし、CryptoAPIもあるでしょうに。
5351:04/01/27 13:21
>>52
ありがとうございます
CryptoAPIはなんとなく分かりますが、opensslはどのように実装するんですか
54デフォルトの名無しさん:04/01/27 16:42

親ウインドウのサイズに子ウインドウを合わせるには
GetClientRectを使いますが、逆に子ウインドウのサイズに
親ウインドウを合わせるにはどうしたらいいですか?

親のCWndに子としてCListBoxを貼り付けたのですが、
CListBoxをMoveWindowすると、勝手に適当なサイズに
整形されるみたいなので、逆にCListBoxのサイズに
合わせて、親ウインドウのサイズも変更したいんですが。
>>54
親に対してGetWindowRect、GetClientRect。
取得したサイズから枠の幅を計算して、子Windowのサイズに加えて変更。
56デフォルトの名無しさん:04/01/27 23:00
>>55
なるほど。
結構手間ですけど、しょうがないのか・・。
ありがとうございます。
AdjustWindowRect…と言おうと思ったが、
ひょっとしてリストボックスの方に
LBS_NOINTEGRALHEIGHT付ければ済む話か?
5832:04/01/28 10:19
http://www.42ch.net/UploaderSmall/source/1075252383.JPG

親 hwndParent = CreateWindowEx( 0... HWND_DESKTOP ... );
子 hwndSub = CreateWindowEx( 0... HWND_DESKTOP ... );
これでウィンドウの切り替えの問題をクリアしたのですが、
上の画像のように、1プロセスなのにウィンドウが2つできてしまいます。

親 hwndParent = CreateWindowEx( 0... HWND_DESKTOP ... );
子 hwndSub = CreateWindowEx( 0... hwndParent ... );
こっちにするとウィンドウは1つしかでてこないので、hwndParent のところは
やはりハンドルの関係の継承だと思うのですが、クリックでの切り替えがうまくできません。
うーむ やはりMDIしかないのだろうか・・・
MapChipの画像がバグってるのは仕様です

// 別に気にしなければいいかな
5932:04/01/28 10:47
とりあえず気にしないことにします
スレ汚しスマン
60デフォルトの名無しさん:04/01/28 11:24
>>32
ヤりたい事は分ーった。アンタァ,これで幸せになれるはずだ。
子 hwndSub = CreateWindowEx( WS_EX_TOOLWINDOW, ..., HWND_DESKTOP ... );
61デフォルトの名無しさん:04/01/28 15:21
プログラムを実行した後、閉じて少しコードを変更してまたビルドすると
次のようなエラーが出ます

LINK : fatal error LNK1168: 書き込みモードで Debug/Project.exe を開けません
link.exe の実行エラー

これはリビルドするともとに戻るのですが、理由として、メモリ
が開放しきれていないのではないことだと思っています。

デコンストラクタで、メモリの開放free()を使っています。ただし、
このプログラムでは200MBほどのファイルを読み込んでいます。
これだけのメモリを開放しきれていないと思っています。

原因はこれで正しいのでしょうか。
また、このような場合はどうすればいいのでしょうか。容量の多い
ファイルをうまく扱うにはどうすればいいのでしょうか。

質問ばかりですいません。よろしくお願いします。
>>60
タイトルバーが気に入らないというレスが付く悪寒
その場合hwndSubを不可視のウインドウの子として作るしかない
6332:04/01/28 16:52
幸せになる〜 ひと〜とき♪

たしかにタイトルバーが変わりましたが、幸せなので大丈夫です。
ここらへんで妥協します。
あんまり影響しないんで
fatal error c1010 : プリコンパイル済みヘッダーの検索中に予期しないEOFを検出しました

ってどういうことでしょうか?
VCのエラーメッセージはドラクエの呪文みたいでワケわからんですね。
>>64
#include "stdafx.h"
ほわっ。
解決しました。
ありがとうございます。
最近同じ質問を何度も見た気がする。デジャヴかな。

CImageList に追加するイメージを動的に作成するために
ウインドウのデバイスコンテキストあるいはそれと互換性のある
メモリデバイスコンテキストから、CBitmap を作成したいのですが、
どうにもうまくいきません。

その方法についてご存知の方居られないですか?

以下はうまくいかなかったソース。
これで作成したイメージは単なる黒塗りの矩形となりました。
bitmapオブジェクトに描くというようなことはできないのでしょうか?

CImageList* CExtListView::MakeDragImage(NM_LISTVIEW *pNMListView)
{

CDC *pDC, memDC;
CBitmap bitmap;

pDC = GetDC();

memDC.CreateCompatibleDC(pDC);
bitmap.CreateCompatibleBitmap(&memDC, 200, 50);

memDC.SelectObject(&bitmap);

memDC.TextOut(0,0, "テストストリング");

ReleaseDC(pDC);

CImageList* pImageList = new CImageList;
pImageList->Create(200,50, ILC_COLORDDB, 1, 3);
pImageList->Add(&bitmap, RGB(0x00,0x00,0x00));

return pImageList;

}
>>69
(・А・) CreateCompatibleBitmap(メモリDC)
(・∀・) CreateCompatibleBitmap(画面のDC)
>>70
うーん。これでも黒い矩形のままでした。
なんでだらう。

CImageList* CExtListView::MakeDragImage(NM_LISTVIEW *pNMListView)
{

CDC *pDC;
CBitmap bitmap;

pDC = GetDC();

bitmap.CreateCompatibleBitmap(pDC, 200, 50);

ReleaseDC(pDC);

CImageList* pImageList = new CImageList;
pImageList->Create(200,50, ILC_COLOR32, 1, 3);
pImageList->Add(&bitmap, RGB(0x00,0x00,0x00));

return pImageList;

}
72デフォルトの名無しさん:04/01/29 02:49
質問です。

xmmレジスタを使いたいのですが、「インラインアセンブラの構文エラーです」と言われてしまい
コンパイルできません。
いろいろとgoogleで検索してみましたが使い方がわかりません。何が必要なのでしょうか。
環境はpen4,VC++6.0です。VC++.netも持っていますが使いづらくて使っていません。

よろしくお願いします。
>>71
ワラタ
何か描いてやれよ。
>>72
VC++6.0でSSEを使いたいなら、
サービスパック4以上とプロセッサーパックをあてなきゃ駄目。
プロセッサーパックは、VCがプロ以上のバージョンじゃないとあてられないけどね。

.netなら素で使えたと思うけど?
7572:04/01/29 04:02
>>74
>.netなら素で使えたと思うけど?

そうなのですか。知らなかったです。
使ってみます。ありがとうございました!!
>>73
書くということは pDCに対して描画するのですか?
それだと画面上に描画されることになりますが・・・。
参考までにシンプルなMFCプロジェクトで
テストできるようにOnDrawに実装したサンプルを
書いてみました。


void CBitmapView::OnDraw(CDC* pDC)
{
CBitmapDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: この場所にネイティブ データ用の描画コードを追加します。

CDC memDC, memDC2;
CBitmap bitmap;

memDC.CreateCompatibleDC(pDC);
bitmap.CreateCompatibleBitmap(&memDC, 200, 50);
memDC.SelectObject(&bitmap);

memDC.FillRect(CRect(0,0,200,50),
CBrush::FromHandle((HBRUSH)::GetStockObject(GRAY_BRUSH)));
memDC.TextOut(0,0, "テストストリング");

//pDC->BitBlt(0,0,200,50,&memDC,0,0,SRCCOPY);

memDC2.CreateCompatibleDC(pDC);
memDC2.SelectObject(&bitmap);
pDC->BitBlt(0,0,200,50,&memDC2,0,0,SRCCOPY);

}

最後の3行で画面に出力されるような CBitmapを作成したいわけです。
上記のコードでは何も表示されませんでした。

ペゾルド見ながら研究してんですが、>>77は適切じゃないみたいですね。
memDCとbitmapをメンバ変数にして初期化で設定、それを
OnDrawでウインドウにコピーすることはできました。

しかし、それをCImageListに加えようとするとうまくいかない
んですよねぇ・・・。
#ifndef INC_TEST_H__
#define INC_TEST_H__
#pragma once
int testproc(int n) { return -n; }
#endif

とだけ記述したヘッダファイルをインクルードしてtestproc()を使用すると、リンカのエラー2005番
「"int __cdecl testproc(int)" (? ......) は既に stdafx.obj で定義されています」
が出てしまいます。やはりヘッダファイルには宣言のみを書き、定義は.cpp等に書くべきなのでしょうか。
WTLなど、ヘッダのみで構成されているライブラリなんかは、これをどのように回避しているんでしょうか。
クラス
>>71
ようやく黒い矩形ではなく、イメージが表示されるようになりますた。
詳しくはこちら↓に書いたので、興味のある人はみてください。
http://forums.belution.com/ja/vc/000/201/75.shtml
マルチかよw
83デフォルトの名無しさん:04/01/30 09:06

CRect を返す関数で NULLを return したら
どうなるんですかね。なんかコンパイラ通っ
ちゃったんだけど、NULL って CRect(0,0,0,0)
と等価なんかな?

それともNULLの代わりにCRect(0,0,0,0)を
返すようにすべき?
>>79
inline
ポップアップメニューで教えて下され

まずリソースエディタでポップアップメニューリソースを作成。
これをLoadMenuでリソースから取り込んでTrackPopupMenuでメニューを出すと、
ポップアップメニュー自体は出るんだけど、リソースエディタで指定したキャプションの
文字列が表示されず文字無しの縦に細長いポップアップになってしまいます。

LoadMenuでハンドルは取れてるし、その妙な細長いメニューも項目数やセパレータの数は
合っているんでLoadMenuやTrackPopupMenuは問題なさそうなんですが…

(リソースファイルから該当部分の抜粋)
IDR_MENU2 MENU DISCARDABLE
BEGIN
MENUITEM "Mode1", UID_EDIT1
MENUITEM "Mode2", UID_EDIT2
MENUITEM "Mode3", UID_EDIT3
MENUITEM SEPARATOR
MENUITEM "抜ける", UID_QUIT
END

↑これの"Mode1"とか"抜ける"といったキャプションが表示されませぬ
考えられる原因があれば教えて下さい。
言語入門書のコードを試してみたいのですが、
VC++.net2003を使って、どうやって.netではない
コンソールアプリを作るのかわかりません。
最初のプロジェクトを作成するところから、すでにわからなくなっています。
ちなみに、ソースはこんなのです。

#include <stdio.h>

void main()
{
  printf("Hello, world!\n");
}

宜しくお願いします。
(゚д゚)
>>85
適当な親のポップアップ項目を作って GetSubMenu() しないと。
ttp://www.kumei.ne.jp/c_lang/sdk/sdk_44.htm
>>88
できますたマリガトウ
ポップアップはすべてサブメニュー扱いだったのね
90デフォルトの名無しさん:04/01/31 16:49
コーティングの質問ではないのですが教えていただけたら助かります。

VisualC++6.0でタブのオートインデントタイプをスマートにしてるんですが、
switch文を書くときになぜかcase文のインデントが一段下がってしまいます。

switch(msg){
  case WM_CREATE:

みたいにしたいのに、なぜか

switch(msg){
case WM_CREATE:

になっちゃう感じです。
これを抑止したいんですが、可能でしょうか?
スマートインデントを切る
92デフォルトの名無しさん:04/01/31 18:01
VC++でMFCを使わずに、ディレクトリの中身以下を全て
列挙したいのですがどうしたらいいのでしょうか?

1.dirent.h みたいなインクルードを教えて
2.opendir(pathn)みたいな関数。
3.ディレクトリとファイルの判定方法。
FindFirstFile(Ex)/FindNextFile
>>93
ありがとうございます。
9586:04/01/31 18:29
。・゚・(ノД`)・゚・。
釣りやネタじゃなくて、マジでわからないんです。
このソース自体はBCCでコンパイルすることはできたんです。
でも、せっかく高いお金出してVS.net買った(2003はただで貰った)ので、使い方を覚えようと・・・

Win32コンソールアプリケーションってのでプロジェクトを作っても、
stdafx.hなんて言う訳わからないのがでてくるし。

ちなみに、
プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
というエラーがでます。

先ほどのコードをVC++.netでコンパイルするための方法を教えてください。
お願いします!

>>90
考え方だけど、case XXXをラベルって考えれば、それで納得できると思わない?
慣れれば、それほど気にならないと思うけど
switch〜caseつかうと増長なインデントになりがちだしこの仕様は悪くないと思うけど
>>95
>>64-67
こういう事かね?
>>97
VCだと、stdio.hは使えないんでしょうか?
入門書の内容を、そのままコンパイルできたらいいなと考えているんですが・・・
BCBを使いなさい。
VC++はうんこい。
10090:04/01/31 19:40
>>91
>>96

参考になります!
有難うございました!
101デフォルトの名無しさん:04/01/31 19:41
ステップインでデバッグしてるとCTR0.Cとかいうファイルを求められるんだけど何なのでしょう?
>>100
参考になった、ねぇ。
スマートインデントを切るって言ったのは
細かいカスタマイズの手段が提供されてない以上不可能って意味な。

>>101
ランタイムのソース
>>98
使える。
stdafx.hはVCでアプリ作るときのおまじないだから気にすんな。

.NETでないコンソールアプリはプロジェクトの作成するとき、
左のプロジェクトの種類でWin32を選べば出てくる。
俺がVisual C++ 6.0 買ったときは ひととおりウィンドウズアプリケーションの
製作方法が書かれたマニュアルが入ってたが
一度 全部読んだのか?

この手の質問いつも疑問に思うのだが・・・
それってラーニングだかスタンダードだかにしかついてこない教本じゃないか?
106104:04/01/31 21:34
俺が買ったのはスタンダードだから
スタンダードには間違い無く入ってる

他のバージョンは買ったひとにしかわからへん

MSでもまともなマニュアルを添付することがあるのか。
じゃあそれだろうな、プロ以上には入ってこない奴。
スタンダードはライセンスや最適化の有無で
購入してない奴が多いんじゃないか?
学生はアカデミック帰るし、社会人はVS買ってただろうから。
109104:04/01/31 22:16
MFC一直線コースのマニュアルだ
まぁそこらへんに落ちてる参考書よりははるかにマシだったな

しかし、この程度の質問するやつが ぷろふぇっしょなる 買うとは到底思えんな
111104:04/01/31 22:20
>>110
YES! YES! (多分そんなんだった)
112デフォルトの名無しさん:04/01/31 23:47
Visual C++ 5.0 Professionalを使っているんですが、
ビルド時に「リンク中..」と出たまま止まることがよくあります。
強制終了でVC自体を終了して再度ビルドすると問題なく完了するのですが。
原因が何か分からないでしょうか?

使用環境
 WinXP Home
 ベアボーンノートPC(Clevo D520P)
 P4HT 2.4C
 PC2100 512MB
質問させてください。
VC++6.0/XP で、SDIアプリケーションを開発しています。

アプリケーションのウィンドウがクリックされたり、タスクバーから
クリックされたりして、アクティブな状態に変化した時に処理を行おうと
思い、MainFrame に、
OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized) を追加して、
if( nState == WA_ACTIVE ){(行いたい処理);}
と記述しました。しかし、タスクバーからクリックされた場合は
この条件で拾えるのですが、画面上にこのアプリケーションと、
アクティブになった別のアプリケーションを表示した状態で、
このアプリケーションのウィンドウをクリックしても、この条件では
拾ってくれません。この場合は、WM_ACTIVE が飛んで来ていないのでしょうか?
マウスクリックのときはWA_CLICKACTIVEで。
11686:04/02/01 22:09
以前少しさわったvisual studio 6.0では、空のプロジェクトに、
前述のソースを追加するだけでビルドできたので、VS.net2003でも同じようにできるのかなと
思ったのですが・・・
そういう意味では、VS6.0の方が使いやすいように思えてなりません。

質問続きになってしまいますが、
stdafx.hをインクルードしないと、VC++.netでアプリは作れないのでしょうか?
できるとしたら、その方法、もしくは、その方法が乗っているサイトを
教えていただけませんか?

ちなみに、購入したのはProfessionalなので、教本はついていませんでした。
いい加減、VBを卒業したいのです・・・
プロジェクト→プロパティ (Alt-P-P)
構成プロパティ>C/C++>プリコンパイル済みヘッダー
「プリコンパイル済みヘッダーを使用しない」を選択
118117:04/02/01 22:41
ちなみに俺はCもVS.NETもまだ昨日始めたばかりだぞ。
俺も86と同じとこでつまづいたが色々いじって解決方法を発見した。
86もがんがれ。
11986:04/02/01 22:41
いろいろ試していたら、stdafx.hを使わずにコンソールアプリをビルドすることができました。

1.新しいプロジェクトから、Win32プロジェクトを選択
2.ウィザードの、アプリケーションの設定から、
 コンソール アプリケーション、空のプロジェクトをチェックし、完了

今までは、アプリケーションの設定画面で、
空のプロジェクトにチェックが入っていなかったのがいけなかったようです。

>>97さん、>>103さん、ありがとうございました。
ボタンが押されるとエディットボックスの数字が
1上がるようにするには

void CtestDlg::OnButton1()
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
}
に何を書けばいいですか?
121デフォルトの名無しさん:04/02/01 23:17
>>86

もちろんその方法でもいいけど、
空のプロジェクトをチェックしなくても可能だよ。

#include "stdafx.h" はプリコンパイル済みヘッダーっていって、
滅多に変更されないヘッダファイルを、
(自分でつくった他のファイルの)コンパイルのときに、
その都度コンパイルしていると時間がかかるから、
先にコンパイルしとくわけよ。

で、MFCが用意してくれるプロジェクトの設定では、
必ず各ファイルに"stdafx.h"という名前のプリコンパイルを、
includeで取り込んでおかなければならないから、
これを削除したりすると、「検索中にEOFエラーが」と出る。
(直接ソースファイルでincludeしなければならない)

普通のCプログラムを書きたいときも、
#include "stdafx.h"
#include "stdio.h"
と追加して書けば問題ない。
もしくはstdafx.h内に、stdio.hを追加するか。
>>120
SetDlgItemInt( IDC_EDIT , (int)GetDlgItemInt( IDC_EDIT )+1 );
123デフォルトの名無しさん:04/02/01 23:24
>>121

自己訂正

>MFCが用意してくれる

じゃないな。Visual Stdioか。
お願いします。

VCで、拡張メタファイル(EMF)→BMPファイル変換の方法を探しています。
VBならば、
 Picture1.Picture = LoadPicture("x:\xxx.EMF")
 SavePicture Picture1.Image, "x:\xxx.BMP"
Delphiならば、TMetaのコンバート関数一発で、TBitMapに変換可能です。
VCでも簡単にできる手法はありますでしょうか?
CImageListとかどうだっけか
>>122
ありがとぅ(´∀`)ノ
>>115

どうも、ありがとうございました。
replace関数を使おうとしているのですが
定義されていない識別氏と出てきます。
algorithmをインクルードしています。
また、void replace(_FI _F, _FI _L, const _Ty& _Vo, const _Ty& _Vn)
の引数をご教授願えませんでしょうか
VC6.0 XP環境です。
>>128
マルチうざいです。
130プロジェクトのコピーについて質問です:04/02/02 13:56
既に完成されたプログラム(ワークスペース)があって、そのコピーを作成して(ワークスペース名は別にしたい)
改良を加えたい場合、どういった手順がよいのでしょうか。

一からプロジェクトを新規作成してファイルの追加やリソース(アイコン等)の作成を行うべきなのでしょうか。

ご教授お願いいたします。
>>128
std::replace()
としないといかんのでわ?
違うかも知れんけど。
MSDNライブラリが分かりずらいです。
素人の自分には読んでも分からないことばかり。

皆さんは、MSDNライブラリが分かりずらいと
思いませんか?

是非、意見を聞かせてください。
分かりずらいです。まず全体の構造が捕らえにくい。
アイコンについて聞きたいことがあります。
MFCで勝手に作られるアイコンを、VCのエディタで修正しても、
そのアイコンに変わりません。
自分でアイコンを作ったものを、自作アプリケーションに使用するには
どうしたらいいのでしょうか?
教えてください。お願いします。
135132:04/02/02 21:36
>>133
そうですよね。
同じ意見の人がいて嬉しいです。
>>132
わかりづらい。でも一番詳しいのがMSDN。
はじめは参考書で勉強するしかないよ。
>>134
試したけど変わるよ。
32x32のアイコンだけ修正して、16x16の
小さなアイコンを見ているのでは?
138112:04/02/02 23:02
>>113
レスが遅れてすみません。
ServicePackは入れてました。念のためもう一度入れましたが、症状に変わりなしです。

時間が空いた時にOSごと再インスコしてみます。
Word2000が終了時にエラーを吐くという症状もあるんで、それも治ることを期待して。
iostreamヘッダをインクルードできないYO!!
#include <iostream>
だけじゃだめなのか?
140デフォルトの名無しさん:04/02/03 00:12
コンポボックス表示のの値が時々変わってしまうのって
何か処理が足りないんでしょうか?
>>139
それで問題ないはず。
どういうエラーメッセージがでるの?
>>140
デフォルトの表示が毎回変わるってこと?
143デフォルトの名無しさん:04/02/03 00:59
説明不足でした

デフォルトはOnInitなんたらで設定しているからいいんだけど
ボタン押したときとかに、クラスウィザードで作ったm_strComb1
を使うんだけど、その後なぜか表示が変わってる
メッセージボックスとかデバッカとかで
追いかけられるとこまで(ボタンが押されたという関数内)
追いかけたんだけど変化してなくて、その後、表示だけ変わってる

何でなんでしょう?
さっぱりわからん
UpdateDataを呼び忘れてるんだろうな

DDX絡み?
おそらく>>145が正解だろうなぁ
148デフォルトの名無しさん:04/02/03 16:00
始めまして、mdbファイルの接続について質問させていただきます。

開発環境:Visual Studio.NET 2003 Professinal
開発言語:Visual C++
DB  :Access2002(.mdb)
接続方法:OLE DB (MFC SDIアプリで使用)
     ADOとODBCは事前に登録が必要等の理由で不可

上記の方法でデータベースを操作・入力を行うアプリを作ろうとしていますが
現在、参照だけしか出来ずレコードの内容が変更できません。
ボタンを作り、メッセージ ハンドラにて
GetDlgItemText(IDC_EDIT1,m_pSet->m_Name,51);
m_pSet->UpdateAll(NULL,NULL,NULL);
と記述しましたが内容が反映されませんでした。
これを解決するためにはどうしたら良いでしょうか?

また、現在1つのテーブルを固定で参照している状態ですが、
他のテーブルに参照を切り替えるにはどうすればいいでしょうか?
よろしくおねがいします。
149デフォルトの名無しさん:04/02/03 16:30

エディットコントロール上にマウスカーソルが来た時にだけ
カーソルを任意の物にしたいのですがうまくいきません。

Window2000,VC++4.0,MFCダイアログ

デフォルトでは I になりますが、これが嫌だったので
変えようと思い下記のようにしました。

(サブクラス化した WM_SETCURSOR ハンドラ内)
HCURSORhcur;
hcur = AfxGetApp()->LoadStandardCursor(IDC_ARROW);
SetCursor( hcur );

しかし、何も変化はありませんでした。
あと、なぜかこのハンドラ内で、

CWaitCursor wait;

とすると、I にも砂時計にもならず、通常の矢印のままになりました。

最終的には自作のカーソルにしたいと思っています。
SetCursor() をどのタイミングで呼び出すべきなのでしょうか?
それとも全く的外れでしょうか?

どうかご教授下さい。
// メッセージの表示
MessageBox(NULL,"メッセージ","タイトル",MB_OK);

↑でコンパイルしたらエラーがでました。
「error C2660: 'MessageBoxA' : 関数が不正な 4 個の実引数をともなって呼び出されました。」

第1引数のNULLを消したらコンパイルできたのですが、オーナーウィンドウの指定っていらないの
ですか?
ちなみに、言語:VC++6.0  OS:WinXPです。
どなたか教えて下さい。
>>150
MFC使ってるんだろ
152148:04/02/03 16:58
>150
最初の引数がいらないんじゃない?
153148:04/02/03 17:00
>150
連投スマン
どうしてもその引数で使いたいなら頭に :: 付ければ
MFCでなくAPI関数の方を呼び出す。
154150:04/02/03 17:17
>150 >>152 >>153
どうもありがとうございます。

MFCなら最初の引数がいらなくて、どうしても使いたいときは
頭に::付けるのですね。(API関数)

すっきり解決しました。感激です。
155150:04/02/03 17:22
>>154
×150→○151
TeraPadのように、縦と横方向にスクロールバーを付けるには、
MFCを使う場合どうすればよいでしょうか?
EditViewは縦しか出ないし。
なんか簡単な方法はありますか?
157148:04/02/03 17:55
コントロールのプロパティでHoriziontal ScrollとVertical Scroll をTRUEにする
>>157
コントロールのプロパティってどうやったら表示できますか?
くだ質に質問したのですがスルーされたのでこっちに質問。
VC++.netのstdでは作成したアプリを公開できないと聞いたのですが本当ですか?
>159
まず、その情報を何処で仕入れたのか教えてみそ
161139:04/02/03 22:07
>>141
error C2065: 'cout' : 定義されていない識別子です。
だそうな。

>>159
金は取れない。公開は可能。以上
162139:04/02/03 22:08
using namespace std;
↑これ書いたら動いた。これどういう意味?
>>161
それは std::cout にしろってことでは?
もしくは
using namespace std;

164デフォルトの名無しさん:04/02/03 22:55
>>149

試してみたけど、そのやり方で普通にできたよ。

BOOL CMyEdit::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
HCURSOR hcur = ::AfxGetApp()->LoadStandardCursor(IDC_ARROW);
SetCursor( hcur );

return 0;
}

これでダイアログのエディット内にマウスカーソルがきても、
矢印のままになった。(CMyEditクラスはCEditの派生)
165デフォルトの名無しさん:04/02/03 23:45
std::vector<char> v;
v.push_back('a');
v.push_back('b');
v.push_back('c');
v.push_back('\0');
char *p = v.begin(); // ここでエラー … p=&v[0]ではok
cout << p;

上のソースはVC++6.0では通るのですが、VC++.NETでは
『 error C2440: '初期化中' : 'std::vector<_Ty>::iterator' から 'char *' に変換できません。
  with [ _Ty=char ] この変換を実行可能なユーザー定義変換演算子がないか、
  または演算子を呼び出せません。 』
と怒られてしまいます。p=&v[0] または p=&v.at(0) では、どちらのコンパイラでも通ります。
なぜ.NETのほうではp=v.begin()でエラーが出るのでしょうか。何かオプションが足りないんでしょうか。
いやエラーコードそのまんまだろ。
biginはイテレータを返すんだと。
VC++6.0で通って.NETで通らないのはbiginが変更されたってこった。
ヘルプ見れ
>>165
v.begin()が返すのは反復子だから、char *p で
受けるのは問題があるんじゃないか?

std::vector<char>::iterator pos;
pos = v.begin();
にする必要があるのでは?

vectorなら v.front() と v.back() が使えます。
168165:04/02/04 00:04
ああ、自分は全然理解してませんでした。確かに、イテレータを返すんなら
イテレータで受けなきゃいけないですね。
# そうすると、挙動からしてVC++6.0のbegin()はただのポインタを返してたのかな。
169デフォルトの名無しさん:04/02/04 00:43
AVIファイルを再生するプログラムを作ったのですが
映像のフレームの1ラインのみ、常に赤線を引いておきたいのです。
しかし、赤線が時間ごとにいつも消えてしまいます。
OnTimerを使ってもちらついたようにしか表示できません。

常にラインを表示するにはどうすればいいのでしょうか。

ソースによる
171149:04/02/04 00:52
>>164
レスありがとう。

何か間違っていたのかもしれません。
もう一度やってみることにします。
それぞれのWindowはマウスカーソルを登録しておける
173149:04/02/04 09:21
>>164
できました。

違いは、OnSetCursor()内で処理した後、親クラスの呼び出しCEdit::OnSetCursor()
をしている事でした。

AppWizard ではデフォルトでこのコードが作成されるのですが、これをコメント
アウトしなければカーソルは変化しませんでした。
174デフォルトの名無しさん:04/02/04 12:00

エディットコントロール内の文字色を変更したいのですが、
今はダイアログ内の OnCtlColor() にてコントロールIDを
判断して文字色を変更しています。

これで問題ないと思っていたのですが、WM_CTLCOLOR は描画される
前に必ず飛んでくると思っていたのですが、内容に変更が無い場合は
来ない事が分かりました。

つまり、エディット内に「123」とあった時、「456」と出力すれば
メッセージは来ますが、「123」と出力してもメッセージは来ません。

そうなると、文字列を変化させない限り、現在の方法では文字色を変化
させることができなくなってしまいます。

このような場合、どうすれば良いのですか?
教えて下さい。
「123」と入力されているエディットに「123」と出力すると、
OnCtlColor() に来ますけど・・・。

あと、再描画を要求するだけなら InvalidateRect()がイイかな。
176デフォルトの名無しさん:04/02/04 20:44
>>174

そのエディットの自作クラスを用意してるなら、
WM_PAINTメッセージを受け取るOnPaint関数をオーバーライドして、
そこへ色を変える処理を割り込ませる、という手でいけるかも。

(でもその自作OnPaint関数でCPaintDCオブジェクトを作らないように。
 で、色を変えたら、CEdit::OnPaintを呼び出す。)
177174:04/02/04 22:14
レスありがとうございます。

>>175
例えば、SetDlgItemText()等で出力していますか?
当方は UpdateData() でメンバ変数経由での更新なので、その違いかもしれません。

>>176
サブクラス化したクラス側でOnPaint関数をオーバーライド、ということですね。
やってみます。
178176:04/02/04 23:14
>>177

そうです。Visual C++側が自動的に関数内にCPaintDCオブジェクトを、
書いてくれると思うけど、それは必ず削除しておいてください。

あと、色を変更したら(例えば何らかの変数に色を記録しておくとする)
エディットのInvalidate()を呼び出して、WM_PAINTが発生するように、
しておく必要もあるかも。

OnPaintの中で、色を記録した変数にしたがって、
実際に文字色を変更する関数を呼ぶ。という感じになるかと。
179デフォルトの名無しさん:04/02/04 23:16
今、実行ファイルとは別にMIDIファイルを読み出して音楽を再生しているのですが
これをMIDIファイルを実行ファイルの中に含ませて再生したいと思っています。
ですがどうすればいいかわかりません。

Wavファイルも同じように実行ファイルの中に含ませて再生するために
リソース化してそしてPlaySound()で再生はできたのですが、
MIDIについてはリソース化してもMCIを使うのでPlaySound()のように
リソースからは再生できないようです。

それでどうすればいいか調べていくうちに他にはリソース化した
MIDIファイルをテンポラリファイルとしていったん書き出して
それを再生するというやり方があると知ったのですが
それはどうやればいいのかわかりません。

こちらの環境は開発環境はVisualC++.NET2003、で言語もVisualC++です。
OSはWindows2000です。よろしくお願いします。
180175:04/02/05 00:26
>>177
CWnd::SetWindowText() と CWnd::SendDlgItemMessage()の両方を
試しましたが、どちらも正常に動作しました。

そちらでうまく動作しないのは、DDXの仕様かもしれませんね。

しかし、再描画の度にOnCtlColor()が呼ばれるのは同じだと思うので、
エディット側のInvalidate()またはInvalidateRect()を呼び出してみては
どうでしょうか?
VC++6.0 のマニュアルが欲しいんですが、どうすればいいでしょ。
割れか?
たぶん割れだな
割れ割れはウチュウジンだ    (喉を叩きながらですよ)
185174:04/02/05 09:54
>>175
>>176

色々やりましたが、エディットの Invalidate() を呼び出す方法が簡単だったので
それを採用しました。

ただ、ヘルプを見ても、なぜこの関数で解決できるのか理解できないので^^;
もう少し調べてみます。

ありがとうございました。

186貧乏です:04/02/05 10:47
現在VC++6.0Proで勉強しているのですが、将来へ向けてC#など.NET Frameworkも
勉強しないといけないと思い、Visual Studio .NET 2003を購入しようと思ったのですが
MSのサイトで動作条件をよく見てみると、モニターが1024x768以上とか書いてあって
手持ちのノートPC3台はどれも800x600なんですが、どうすればいいのでしょうか?
187貧乏です:04/02/05 10:53
外部モニターは置き場所が無いし、うざいので嫌です。
1024x768の液晶のノートを買うようなお金はありません。
なんとかがんがって独学してきたけど、もうだめぽです。
今の時代、お金が無いと満足に勉強することもできないんですね(泣
188貧乏です:04/02/05 10:56
当然、仮想解像度なんて気の利く機能は手持ちのノートPC3台にはついてません。
SDKでやれ。あとC#やりたいとか基本的にスレ違いなことに気づけ。
>>186
アコムとかプロミスとかレイクとかいっぱいあるじゃん。

ノートPC3台も要るのか?
全部売って、液晶モニタ+デスクトップPCが買えるのでは?
192デフォルトの名無しさん:04/02/05 15:58
std::floorの機能について調べたいとします。
VS.NETのヘルプでキーワード検索しても見つかりません。
そういうときどうやって解決してますか?
手元の本の索引にもなく、キーワード検索にもひっかからず、ぐぐるとひっかかりすぎる。
そういうとき(´・ω・`)なのです。
SDIで、簡単なテキストエディタを作ろうとしています。
Viewの基本クラスをCEditViewにすると、縦方向のスクロールバーは表示されますが、
横方向のスクロールバーは表示されません。
縦横両方スクロールバー付きのエディタを作りたいのですが、
どうすればいいでしょうか?
Viewの基本クラスを変えたほうがいいのか、
なにかオプションで横方向のスクロールバーも表示できるのでしょうか?
教えてください、お願いします。
194デフォルトの名無しさん:04/02/05 16:17
>>193
LONG style = GetWindowLong(GetEditCtrl().GetSafeHwnd(), GWL_STYLE);
style |= WS_HSCROLL;
SetWindowLong(GetEditCtrl().GetSafeHwnd(), GWL_STYLE, style);

これでどお?
>>194
記述の場所はCEditViewのOnCreate がよさげ。
>>194
この3行をどこに追加すればいいのですか?
>>196はなかったことに。
>>195
たびたびすいません。
OnCreateという関数が見当たらないのですが。
PreCreateWindowに追加してみたけど、変化がありませんでした。
CMainFrameにOnCreateがあるのですが、
ここに追加しても、エラーが出てしまいます。
>>198
WM_CREATE のハンドラを作ると
OnCreate になりまつ。
>>198
       ヽ(・ω・)/   ズコー
      \(.\ ノ
>>199
WM_CREATE のハンドラ作り方がわかりません。
こんなことまで聞いてすみません。
初心者なので、どうか教えてください。
ヘルプみろよ・・・
>>201
左側のクラスの一覧で
CEditViewの派生クラスがあるでしょ?
そこで右クリック->「Windowsメッセージハンドラの追加」を選択。
WM_CREATEを選んで「追加と編集」

これで作成されるはず。
ハンドラは作れて、スクロールバーも表示されるのですが、
バーが機能しません。
長い文章を入力しても、バーが使えない状態です。
どうすればよいでしょうか?
横スクロールバー作成できたの?
>>205
バー自体は出てるのですが、機能しません。
長い文章が、端で改行されてしまう状態です。
ES_AUTOHSCROLL
>>207をどうすればいいんですか?
なんつーか、スレタイがそうさせるのかなぁ……
>>208
Googleで検索
211デフォルトの名無しさん:04/02/05 17:37
MFC の CString についてなのですが、

例えば
------------------------------------
CString csData( _T("12345") );

csData = csData.Left( 3 );
------------------------------------

これってアリですか?
実際処理は問題無さそうですが、同じ領域同士で操作しているようで
何となく不安です。

ちなみに今は、こうしています。
------------------------------------
CString csData( _T("12345") ), csTemp;

csTemp = csData;
csData = csTemp.Left( 3 );
------------------------------------

アリなのであれば、当然1つの領域で処理したいです。

教えて下さい。
Left()はCStringを返す
それは、元のCStringとは全く別の物
213211:04/02/05 17:57
レスどうも。

なるほど。
これで効率よくコーディング出来そうです。
ありがとうございました。
>>210
Google検索でひっかかりました。
ありがとうございました。
VC++で、Web上の辞書サイトから英単語を検索して、
意味を文字列として取得することは可能でしょうか?

簡単な方法を教えてください。
あとこういう用途に向いた辞書サイトってありますか?
>>215
簡単な方法はないと思う。(w
MFCで言えば、CHttpFile でネットからHTMLファイルを
取得して、自分で解析することになるのでは?
217デフォルトの名無しさん:04/02/06 01:45

スプレッドシートを使いたいんですが、MFCでは
適当なライブラリはないですか? 
リストビューはちょっと違うみたいだし、
自分で実装することになるのかな?

MFCの使用ってなぜ控えた方がいいんでしょうか?
MS的には、.Net環境に対応してなからでないの?
220181:04/02/06 11:58
>>182
>>183

きみら、誰に言ってるの。
ms vc++ 知ってれば、何を言っても良いのか。
ms vc++ 知らざるものは、人にあらずか。

msdn でぐぐってモニタで見るだけでは、やはり同時性、一覧性がない。
マシンデバッグ、マシン読本だけでは、第一、楽な姿勢になれず疲れる。
だから、6.0の中古本のマニュアルあれば、それを譲って(買取させて)
もらおうと思っていただけ。印刷するのは大変だから。
ソフトは会社所有で数も1パックじゃない。だから「割れ」ではないんだ。

>>220
そもそもマニュアルって何を指してるのよ。
>>181だけじゃStandard版に付いてくる本ともとれるしMSDNライブラリのCD-ROMともとれる。
「どうすればいいでしょ。」って、本が欲しけりゃ買えよ。
222デフォルトの名無しさん:04/02/06 12:20
>>220
その必死さから、割れが濃厚になってしまった。
残念です。
アスキーから出てるオフィシャルリファレスとか、ペゾルド本でも買っとけよ。
224デフォルトの名無しさん:04/02/06 14:00
CStringを多用するとcharなんかを使って処理する場合に
比べるとおそいんですか?
そりゃ、CStringは内部ではcharを処理してるんだから
速くなる事は無いだろ
もちろん処理の内容によるけど、CString の方が速いケースもありうるだろ。
>>224 が CString 作った奴より上とは限らんし。
要は、>>224 次第ってことだ。
>>224
下手なコード書くよりMFC使った方が断然速いよ
STD版VCとか最適化がカスタマイズできないコンパイラの場合は特に

やってみればわかる
CStringはメモリを動的に確保・拡張するから遅い。
サイズを事前に決定して、拡張する必要が無いのなら
(サイズ以上の文字列はカットするだけとか)
char 配列のが段違いに速い。
速度が求められていないところでは CStringでいいけど。

コードの書き方や最適化云々の話では無いと思うが。
229もしかして釣りか ?:04/02/07 10:07
>>228
> サイズを事前に決定して、拡張する必要が無いのなら

そんな仮定を勝手に置けばそうなのかもしれないな。

> 速度が求められていないところでは CStringでいいけど。
> コードの書き方や最適化云々の話では無いと思うが。

はぁ...、未だにこんな思い込みをしてる奴っているんだな...。
確かCStringってMFC4.0の頃にだいぶん改善されたよな。
>>229
>そんな仮定を勝手に
勝手にも何も、そういう場合は往々にしてあるが。
長大な文字列を確保して一時的処理をするようなことを連続するとかなりの
オーバーヘッドが生じる。でもそれって標準関数使っても同じことだし。
CStringの気安さからそうしがちってことならあるかも。

CString使うならFindやMidで頻繁に加工すると思うけど、それを代わりに
標準関数で手前コード書くとかなり遅くなる。
>>231
だからなに ?

あんたが「勝手な仮定を置いた」と言う事実は消えないが、何か ?
>>233 = >>229
if文を使えない

へぇ〜
 へぇ〜
  へぇ〜
235デフォルトの名無しさん:04/02/07 13:05
>勝手な仮定を置いた
なんじゃこいつは?
使い方によって状況が変わってくるんだから例を挙げるのは当然のことだろ。

いかなる場合においてもMFCが最高ならば、あんなに糞扱いされてないんだろうな。

>>233
なんでこいつこんな必死なん?
>>234

>>228
> CStringはメモリを動的に確保・拡張するから遅い。

if 文の外にありますが何か ?
237228=231:04/02/07 13:37
>>233
その「勝手な仮定」って主張する意味がわからんよ。
仮定もクソもない。場合によって使い分けるのは当然だろう。

てか、「勝手な」などと言われるほどスペシャルケースでもないぞ・・・
どっちの場合もよくあること。仕事してないでしょ。学生さんか。
238228=231:04/02/07 13:40
あと >>229
>はぁ...、未だにこんな思い込みをしてる奴っているんだな...。

思い込みじゃない。断じて。
メモリ確保・拡張のオーバーヘッドはかなりのもの。
それが解らないのなら、そういう問題にあたったことが無いんだろね。
経験ないのなら黙ってな。
>>235, >>237-238
> 場合によって使い分けるのは当然だろう。

そう、当たり前。

だから、>>228 の一行目で
> CStringはメモリを動的に確保・拡張するから遅い。
なんて、断定するのがおかしいだけ。
char * でも同じようなことすればたいして変わらんよ。

>>224 がそういうこと (=動的確保・拡張) をしたいのかどうかはわからんけど、わからん間はあんたの「勝手な仮定」と言われてもしょうがない。

それとも、CString のメモリ管理に重大なオーバーヘッドを生む要因があるのか ?
それならそれを指摘すればいい。
240デフォルトの名無しさん:04/02/07 14:23

このままいっても、堂々巡りぽいな。

>>224
>「CStringを多用するとcharなんかを使って処理する場合に
>比べるとおそいんですか?」

こんな抽象的な質問するからいけないんだ、てことにしておこうじゃないか。

もしまだ、>>224 居るなら、どういう風に使うのか言ってみたらどうか

本当に速度にシビアな状況なら、そもそもMFC自体使わないだろう。
>>240
> 本当に速度にシビアな状況なら、そもそもMFC自体使わないだろう。

プッ、言ってるるそばから....。

速度的に MFC のどこがどうまずいのか指摘してからにしてよね。
動的な文字列において、
中身に頓着しない単純なデータがほしいのならCStringは無駄の無い優れた選択。
マルチバイト文字列やパスのような先頭から走査する必要のあるデータの場合には
長さや終端を保持するメモリ領域やコードが無駄になる。

ほしいのがブロックなのかストリームなのか、最低限その辺だけ抑えればあまり無駄にはならない。
#include <string>

using namespace std;

string str("(`・ω・´) シャキーン");
244デフォルトの名無しさん:04/02/07 19:17
すごく初歩的な質問で申し訳ないのですが
HSPなどでは上から下へプログラムが実行されていくので非常にわかり易いのですが
VC++もMain関数が終わった後にウインドウプロシージャが実行されてプログラムが終わるのでしょうか?
>>244
基本は上から下に流れるけど、
下から上にいくことができる。
99.99999% 下から上にいくことがある。

入り口は一個 出口も一個
途中は分岐、繰り返し、呼び出し
246228=231:04/02/07 22:02
>>239
>断定するのがおかしいだけ
くだらん揚げ足ウザイ
お前は「ただその一点だけ」でここまで食い下がってるんだよ。
いいかげんにしとけアフォ

それにしてもお前は全然解ってないようだ・・・
>CString のメモリ管理に重大なオーバーヘッドを生む要因があるのか ?
動的なメモリ確保・拡張そのものがオーバーヘッドかかるんだよ。
何もMFCが悪い、CStringが悪いなんていってねーだろが。
管理もクソもねーんだよ。
動的なメモリ確保のコストなんて加算1回+αまで短縮できるし、
それ以外の方法となるとスタックに配置した「固定長の文字配列」を
文字列代わりに使うしかなくなるわけだが。
>>246
> 何もMFCが悪い、CStringが悪いなんていってねーだろが。

やれやれ、ヴァカは自分の書いたことすら忘れてるのか ? (藁

>>228
> CStringはメモリを動的に確保・拡張するから遅い。
> 速度が求められていないところでは CStringでいいけど。
>>240
> 本当に速度にシビアな状況なら、そもそもMFC自体使わないだろう。
249割り込みごめん:04/02/08 01:25
>>248
「遅い」とは書いてあるが「悪い」とは書いてないような。
「遅い」=「悪い」なのか?

CStringが速いのはCStringからの初期化と代入くらいじゃないの?

>>241
MFCのソースを見たことがあるのだろうか?
>>249
> 「遅い」とは書いてあるが「悪い」とは書いてないような。

それじゃまるで子供のいいわけだな。(藁

で、彼は MFC は悪くないのに「本当に速度にシビアな状況なら、そもそもMFC自体使わないだろう。」とか言っちゃってんだよね。

速度にシビアな状況で、「遅い」ことは「悪い」ことじゃないの ?
悪くないならなぜ使わないの ?

> MFCのソースを見たことがあるのだろうか?

心配しなくとも見る事できるから、バージョンとファイル名と行数を書いてくれれば大丈夫だよ。
で、君が彼に代わって指摘してくれるの ?
251デフォルトの名無しさん:04/02/08 10:31
CString と std::string はどっちが速いでつか?
char *とCStringの比較なら、長さを求めるのに
strlenをいちいち発行しなくてはならない点で、
char*は不利かもね。
なんじゃ?このスレの流れは?
子供の喧嘩?
>>251
自分で測定しな。
処理の内容も、クラスライブラリのバージョンも実行環境も君と俺では違うだろうから。

>>252
char * 側も長さ情報を持つようにすればいいだけ。
もっともそういうのをやりだすと結局 CString と同じようになるわけだが。
あとは、その実装をやる奴の腕と CString の作成者の腕の勝負になるだけのこと。
まあ、実装をやる奴 = 使う奴なら個別の最適化が可能なので腕が同じ程度なら char * が幾分有利。
ただ、CString の作成者に比べて腕がショボーンかもしれないので、勝負はやってみないとわからん。
参照 → >>226

>>253
脊髄反射で、>>225 を書き込んだヴァカがからかわれてだけだろ。
char を処理する方法でCStringは作れるが逆はできない
だからなに ?
>>254
> >>253
> 脊髄反射で、>>225 を書き込んだヴァカがからかわれてだけだろ。

間違いでは無いと思うけどなー。
CString が Pascal のように文字長を持ってれば話は違うのだろうが。。
>>251
inline を多用しているSTLの方が速いと言う話も。
つか、VC++ で std::string を使ってる香具師って居るのけ?
>257
struct CStringData
{
long nRefs; // reference count
int nDataLength; // length of data (including terminator)
int nAllocLength; // length of allocation
// TCHAR data[nAllocLength]

TCHAR* data() // TCHAR* to managed data
{ return (TCHAR*)(this+1); }
};
_AFX_INLINE CStringData* CString::GetData() const
{ ASSERT(m_pchData != NULL); return ((CStringData*)m_pchData)-1; }

>258
std版では最適化が効かないからどうだろうねぇ。

最近のパソコンで速度なんて気にする必要あるのかね。

>>257
> CString が Pascal のように文字長を持ってれば話は違うのだろうが。。

はぁ ? >>252 を読んでないのか ?

ちなみに、手元の MFC のソースは...と思ったら、>>259 が貼ってた。

「脊髄反射」じゃないとしたら、真性なのか... ?

とにかくもう少し落ち着いててから書いたほうがいいぞ。

>>260
君の作るプログラムなら、必要ないと思うよ。
262257:04/02/08 12:25
>>259
CString は NULLターミネート文字列を使ってるが内部の処理では
NULLターミネート使わずに処理してるのね・・・ ソス見ずに脊髄反射してしもうた _| ̄|○

strcpy, strcat, .... 使うより速い鴨。。
>>260
本物のプログラマは、たった数μS速くするためにでも命を賭ける。
厨なプログラマは厨に分かるようなプログラムを書く。
漏れは厨なプログラマのままで良い。
>>259
CString の中の人も大変だな。

std版では、inline キーワードは無視されるの? そりゃクソだな。w
>>263
> 厨に分かるようなプログラムを書く。

これができれば、厨とは言わない。

厨の書くプログラムはワケワカメ。

> 漏れは厨なプログラマのままで良い。

だから、改心しろ。

何 か 微 妙 な 流 れ で す が …

誰が作ってもCString / std::string / std::wstring の
パフォーマンス超えるものは作れませんよ。
できるのはパフォーマンスの調整ぐらい。

要はクラスの性質を理解してパフォーマンスを生かすように使わないと。
それは、char* を使う場合でも同じ。

最適化 = inline展開 な>>264にパフォーマンスなど関係ないかもしれんが。
267デフォルトの名無しさん:04/02/08 13:43
>>266
>できるのはパフォーマンスの調整ぐらい。

どうやってやるの? 教えてクレ
>>267
文盲の方ですか?
>>268
そういう事にしたいのですか?
>>269
あなたは>>266を本当にお読みになりましたか?
>>270
はい。
で、どうやってパフォーマンス調整をするのか聞いてるのですが
何か問題でもありますでしょうか?
>>266
漏れの天才的な頭脳と __asm {} を持ってすれば不可能は無い。
>>271
>>266
>パフォーマンス超えるものは作れない
と書いてます。もし、同じようなものを自作しても
パフォーマンスの調整版にしかならないと書いているのです。

文字列というのは要するに固定長の配列なわけです。
それを可変長であるかのように振舞わせるわけですから
パフォーマンスの調整の余地があるわけです。

おわかりになりますか?
>>266
ようは、

  実  行  速  度  な  ん  ぞ  気  に  す  る  な

と言うことでよろしいか?
>>273
分かり難い文章ですが言われてる事は分かりました。

一般的にパフォーマンス調整(パフォーマンスチューニング)と
言うと、パフォーマンスの改善、つまり速くなることと理解しますが。。
「初心者に・・・」というスレタイ向けにまとめれば

普通は心配せずにCStringを使っておいて間違いはない

という結論かと
>>274
違う、

藻 ま え ら の よ う な ア フ ォ は ブ ビ で も 使 っ と け。

と言う意味。
>>275
オレは書いた人じゃないけど
パフォーマンス・チューニングじゃなくて「パフォーマンスの調整くらい」
つまり「パフォーマンスの調整程度」というニュアンスだろ

普通に文意を汲めば「多少の加減」という意味だと思うが
>>276
殆どの場合の文字列操作は、char [] と ANSI C 文字列関数を使うより
MFC CString を使った方が速い。

ということかと。
         \   ∩─ー、    ====
           \/ ● 、_ `ヽ   ======
           / \( ●  ● |つ
           |   X_入__ノ   ミ   そんな餌で俺様がクマ――!
            、 (_/   ノ /⌒l
            /\___ノ゙_/  /  =====
            〈         __ノ  ====
            \ \_    \
             \___)     \   ======   (´⌒
                \   ___ \__  (´⌒;;(´⌒;;
                  \___)___)(´;;⌒  (´⌒;;  ズザザザ
                               (´⌒; (´⌒;;
で、VC++ でウイソのアプリを作るのに std::string を使ってるヤシは居るのか?
漏れはそれが知りたい!!
>>266
> 誰が作ってもCString / std::string / std::wstring の
> パフォーマンス超えるものは作れませんよ。

またこんな断定するヴァカが出てくるし...。
何の根拠があってこんなこと書くかなぁ。

もうネタの投下はいいよ。
>>282
ヴァカはお前の方だ。STLの仕様はC++標準委員会で
詳細に決まってんの。


無知は怖いね。
>>283
藻まいのようなヤシをプログラマーに使いたくないぞ。
何が出来るか分からないから。
>>281
(´・ω・`)∩
286266:04/02/08 17:13
>>274, 277, 279
おぃおぃw

>>281
漏れはCStringが必要なとき以外はstring/wstringだね。

>>284
ご自分の勉強不足を反省してはいかがですか?
>>283-284
決まってるからどうかしたのか ?
それが最高のものである保証はどこにあるんだ ? (ププッ
>>286
>>282>>283 の話の内容がかみ合ってないのは気のせいか?
当然、後からとんちんかんな事を書いた >>283 がアフォだと思うが。
ねぇねぇ、STLの実装ってコンパイラによって激しく違うのけ?
>>287
仕様と実装を区別してないだろ?
Effective STLでも読んで見れ。

>>288
stringはSTLの1クラス。

>>289
STLのベンダごとに違う。
前にもどっかのスレにいたなぁ。
標準ライブリラリは標準委員会が実装方法を決めていて、どのソースも同じだと思ってた奴。
ライブリラリって何だ、俺。
>>292
ついでに

>標準委員会

標準化委員会な、確か。
各自Effective STLの第二章を読めってことでそろそろお開きにしてくれないか…
295288:04/02/08 18:38
>>290
文字列クラスのパフォーマンスとSTLの仕様の話じゃ未だかみ合ってないぞ〜。
296デフォルトの名無しさん:04/02/08 19:00
VC++ 6.0 で C++ の構文を弾くようにするのはどうすれば良いのでしょう?
C の構文だけ通すようにしたいのでつ。
>>296
拡張子を .c にする。
299287:04/02/08 19:26
>>290
> 仕様と実装を区別してないだろ?

何で俺に言う ?
>>297
そんな簡単な事だったのか。
オプションには無いはずだ。_| ̄|○
ん?/Tcでもいけるはずだが。
302デフォルトの名無しさん:04/02/08 21:52
>>299
だよなぁ
303249:04/02/08 22:42
>>250
子供のいいわけねえ。

>悪くないならなぜ使わないの ?
どこに「使わない」なんて書いてあるんだろう?
ひょっとして「仕様書の行間」を読み過ぎる人ですか?

>心配しなくとも見る事できるから、バージョンとファイル名と行数を書いてくれれば大丈夫だよ。
MFCの構造による速度のことを言っているのにファイル名と行数ねえ。
ひょっとしてここもCString限定なのか?

俺は
>本当に速度にシビアな状況なら、そもそもMFC自体使わないだろう。
こんな事態に遭遇したことはない、つーか今更MFCは外せないから
MFCのソースを引張ってきて書き換えてる。
MFCは便利ではあるがその分内部構造が複雑になっているから
速度面で不利になることも事実。
でもそれを気にしているのはメイン作業のCADだけだな。
その他の請負い作業ではまず気にしない=する必要がないな。
ぬるい303がいるスレはこちらですか?
つーか、まだやってるのか。
>>303
> どこに「使わない」なんて書いてあるんだろう?

自分でも引用してるんだけどな。

>>240
> 本当に速度にシビアな状況なら、そもそもMFC自体使わないだろう。
                               ^^^^^^^^^^^
(まーた、「使わない」とは書いてない、「使わないだろう」と書いてあるとか言い出すのかな ? (ププッ))

> MFCの構造による速度のことを言っているのにファイル名と行数ねえ。

で、どこの構造がどうだと言うの ?
ソース見た事あるかなんて書く位だから、具体的に指摘してくれるんだよね。

> ひょっとしてここもCString限定なのか?

あらら、話が大きくなってきましたねぇ。
知ったか厨が、人を煙に巻く時によく使う手 (まあ、自爆するのがオチなんだが) ですけど、あんたはそんなこと無いよねぇ...。
CString 限定でなくていいから、MFC の構造と速度についてきっちり指摘してくれ。
>>263
本物のプログラマがどういう範疇に入るのか分からないが
プロのプログラマは要求仕様と時間効率で最善の方法を選ぶよ
仕様によってはVBだって使うし、アセンブラだって使う
とりあえずマの話はマ板でやれや
>>307
ネタにマジレスしてるとこ悪いが、「本物のプログラマ」でググルことをお勧めするよ。
重要なのは、文字列の性質をちゃんと理解して使えば
どんなクラスを使っても大きくパフォーマンスが異なることは
ないんですよ。

初心者が良くやる極端な例:
vector<string> v;
/* v に文字列を沢山詰め込む処理 */
string str;

for(int i=0;i<v.size();i++)
{
    str += v[i];
}
311307:04/02/09 00:19
ググってみた
へー、面白いなぁ"本物のプログラマー"なるほどネタなのね

ここが何スレかわかった上で書いているのか君達は
初心者のコードに見られる極端な例。
char *p = _strdup("hogehogefoo...")に対して、
for( int i=0;i < strlen(p); i++ )
{ p[i]++;}
314249:04/02/09 01:01
>>306
「遅い」=「悪い」から出てきた話なのに単純に「使う」「使わない」に
なっちゃってるよ。
「MFCの構造による速度」はそういう状況になれば理解出来るようになるから
焦るな。
スレ違いなのと面倒くさくなったのとププッとか書くやつの相手をするのが
いやなのででもうレスはしません。

このスレの皆さんへ
本当は>>310のようなことを言おうと思ったのだが、ちゃちゃを入れたせいで
おかしな方向へいってしまったことをお詫びします。
315俺用メモ:04/02/09 01:27
結局結論は >>266 で、文字列を直接いじる場合でも
クラスで使う場合でもパフォーマンスを落とさない使い方を
するのがいいんですな。
あのさー、良くわかんないんだけど

>誰が作っても<CString / std::string / std::wstringを使って>
>CString / std::string / std::wstring の
>パフォーマンス超えるものは作れませんよ。

ということなのか?
これなら話のつじつまは合うんだけど・・・
言ってること自体が意味不明なんだよな。
317デフォルトの名無しさん:04/02/09 11:35

string のついでに質問なんだけど、Windowsって
仮想メモリがあるけど、stringで長い文字列を
作っていくと、自動的にHDDも使ってくれるんでしょうか?
まあ、stringに限らずに vector でも list でも、いいんだが。

>>317
OSがスワップしてくれるでしょ。 激遅だと思うけど。
319遅いコードw:04/02/09 13:51
char cpysrc[] = "abcdefghijklmnopqrstuvwxyz";
char* pcreate = new[strlen(cpysrc) + 1];
strcpy(pcreate, cpysrc);
char* pcreate = new char[strlen(cpysrc) + 1];
>>320
ゲゲッ  コンパイラさんに頼ってるから・・
322遅い!遅すぎる!!:04/02/09 19:33
static char str[] = "hoge";
wstring str(L"実行速度?シラネーヨ!( ´ー`)y-~~");
ビルドしたらリンク中とでて止まったまま・・・・
>>312
> ここが何スレかわかった上で書いているのか君達は

初心者に、「MFC の構造による速度」を教えるスレだろ。(藁
講師: >>249

>>314
> 「遅い」=「悪い」から出てきた話なのに単純に「使う」「使わない」に
> なっちゃってるよ。

じゃあ、速度の話に戻すけど、今でも「CStringが速いのはCStringからの初期化と代入くらいじゃないの?」とか言うのか ?

> 「MFCの構造による速度」はそういう状況になれば理解出来るようになるから焦るな。

「MFCのソースを見たことがあるのだろうか」なんて大口叩いてたのに、具体的に聞くとこれですか ?
まあ、予想できたけどな。

> スレ違いなのと面倒くさくなったのとププッとか書くやつの相手をするのが
> いやなのででもうレスはしません。

ハイハイ、「面倒」と言うことにしておこうな。

> 本当は>>310のようなことを言おうと思ったのだが、ちゃちゃを入れたせいで
>>310
> どんなクラスを使っても大きくパフォーマンスが異なることはないんですよ。

はぁ ? まあ、もういいか。
>>325
ない爪を隠してもしょうがないんじゃない?(ププッ
327これで本当の最後:04/02/09 23:48
>>325
もう一回だけ相手をする。

310の引用は
>初心者が良くやる極端な例:
この部分にしてくれ。

問題が分かってないのかな〜?
328327:04/02/09 23:51
>>325
>>326は俺じゃないよ。
勘違いされそうなんで一応。
>>326
負惜しみカコ悪い。

>>327
> /* v に文字列を沢山詰め込む処理 */

コメントからしてハァ ? なんですけど。
もういいじゃん
とりあえず初心者が質問しやすい流れを作ることもこのスレの回答者たちの役目だろ
ここ100近くの間に初心者の質問がいくつあったよ?
はっきり言って、初心者が質問しにくいレスを付け続けている
奴らは別のところにいってやってくれ
331310:04/02/10 00:01
チャレンジャーだねぇ。
EffectiveSTLの文字列クラスの実装の項を
読んでみることをお奨めするよ。

>>327
そのコメントのどこらへんが「ハァ?」なの?
どうせ逃げるんだろうけど。

あと、何を誤解してるか知らんけど、>>327 != 310 ね。
332310:04/02/10 00:02
ぬお、「ハァ?」は>>327じゃなくて、>>329な。
はぁ


--- 以下しばらく中身のない低俗な煽り合いをお楽しみ下さい ---

>>330
逆さ縦読みか?
Win2000 SP4 環境下で、VC++6.0のプロフェッショナルエディションを使用しています。

見た感じ、>>112さんと同様と思われる症状が現れるのですが、
(VC6でも)サービスパックをあてれば直るもんなのでしょうか?

ナローバンドなうえに長時間接続できないので、
特に問題がないなら、所詮日曜プログラマなので、SPを入れなくてもいいかなとは思っていたんですが…。
もしかして林晴彦著新Visual C++6.0入門シニア編(ソフトバンク)の
P558に出ていることじゃないか?
ビルドの黙り込み対策
本屋で見てくれ。
・・・かもしれないですね。

林晴比古氏(変換めんどいよ!)のC言語入門で学んだ人間なんで。
彼の本なら安心して買えるかなあ。
……もしかして、根本的な解決策、無い……?


ちょっとぐぐってみたら、
ハイパースレッディングの機能をBIOSでオフにしろとか書いてあったけど……
片方のコンボボックスのデータを変えてエディタボックスにデータに応じた値を表示した後
もう片方のコンボボックスのデータを変えてエディタボックスに表示されている値に
そのデータに応じた値を加算させたいのですができません。助けて!
片方のコンボボックスのデータを変えてエディタボックスにデータに
応じた値を表示するところまでは出来るの?
>>341
どこまでできて何ができないのか具体的に
>>342
そこまではできます

例えばコンボボックス1でAというデータ(対応する値は10)を選択した際
10という値をエディタボックスに表示させることはできるんですが
その後コンボボックス2でBというデータ(対応する値は5)を選択した際
現在エディタボックスに表示されてる10に5を加算して15という値を表示させたいのに
何故か5と表示されてしまいます。
>>344
10を表示する時に、その値を覚えておいて、
15を表示させたい時にたせば?

15表示する時に、10のエディットボックスから拾ってきてもいいけど。
>>344
そのエディッタボックスってのは、コンボボックスの中の香具師?
それとも独立したエディッタボックス?
>>345
そのやり方がよくわかりません・・

>>346
独立したエディタボックスです

もうちょい試行錯誤してきます
348デフォルトの名無しさん:04/02/10 15:43
ダイアログベースのアプリケーションでメインダイアログから
Create()を使ってモードレスダイアログを作成したあと、
2つのダイアログを重ねたらモードレスダイアログの方が必ず上に
表示されます。
アクティブになっている方が上に表示されるようにするには
どうすればよいのでしょうか?

分かる人がいたら教えていただけないでしょうか?
349デフォルトの名無しさん :04/02/10 16:14
もし定説だったらごめんなさい。
VC++で、DualCPUを生かしたビルドってできませんか?
DualCPUのPCでビルドしても、かたっぽのCPU使用率がMaxになるだけで、
二つをフル稼働させてないんですが・・・・。
どこかで設定できるのであれば、教えて欲しいです!
できない
MDIのアプリを作っているのですが、下のような感じで
4つの子ウィンドウ(フレーム、Doc-Viewの1対1)を表示させているのですが、
「 ̄ ̄ ̄|「 ̄ ̄ ̄| 
|_A_」|_B_」 
「 ̄ ̄ ̄|「 ̄ ̄ ̄|
|_C_」|_D_」
ここでドキュメントBを破棄したときにMditileを通すと
「 ̄ ̄ ̄ ̄ ̄ ̄ ̄| 
|__A____」 
「 ̄ ̄ ̄ ̄ ̄ ̄ ̄| 
|__C____」 
「 ̄ ̄ ̄ ̄ ̄ ̄ ̄| 
|__D____」 
のようなイメージになってしまうのですが、これを
「 ̄ ̄ ̄| 
|_A_」
「 ̄ ̄ ̄|「 ̄ ̄ ̄|
|_C_」|_D_」
のようにする(Bが表示されていた場所には何も表示しない)方法があれば、ご教授をお願いいたします。
長文失礼しました。
>>348 モードレスの親をデスクトップにしてCreateするとか
353デフォルトの名無しさん:04/02/10 17:47
アルゴリズムで曜日の算出法おしえてください!
Y.M.D
△Y=2000−Y
△X=△Y/4
△Z=△Y−△X
1990/1/1をこれに当てはめると75がでてそのあとどうするばよいかわかりません


>>353
「Zellerの公式」でぐぐれ
355デフォルトの名無しさん:04/02/10 18:35
最後に7で割るのであまりは少数のところはどうすればよい?
剰余を出すなら小数にならんだろ
357デフォルトの名無しさん:04/02/10 18:47
公式に当てはめた段階で小数が出ますヨ?
出ませんヨ?
キャストしろ
宿題スレの予感
コンパイルはできたけどビルドができないよ〜
うわーん ゜。(pvq)。゜
なんかね、とまっちゃうんですよ。ビルド押すと・・・
そいで終了させようとしても・・・ビルドの中止ボタンを押してくださいとかいってるの・・
んでねビルドの中止おしても無反応なんですよ・・;
なんか解決方法ないっすかね?^^;

やってみたことは
再インストール
サービスパック5を入れる(日本語
です。
362デフォルトの名無しさん:04/02/10 21:56
CFormViewから派生したビュークラスを使用しているとき
ダイヤログリソースでVisibleをFalseにしてないとエラーが出てしまいます。
私の感覚的には見えるようにするのだからTrueだと思うのですが、
どうしてFalseにしないとエラーが出るのでしょう?
VisualC++でビッグエンディアンのプロセッサのCソースを
直さずになんとか動かす方法はないですか。
>>362
>ダイヤログ
>>331
> EffectiveSTLの文字列クラスの実装の項を読んでみることをお奨めするよ。

ハイハイ、そういう言い訳は聞き飽きた。
で、どうせ具体的に指摘できないんだろ ?

> >>327
> そのコメントのどこらへんが「ハァ?」なの?

>> v に文字列を沢山詰め込む

どの行で、「v に詰め込んでいるのか」教えて欲しいものだ。

> どうせ逃げるんだろうけど。

なんて人を煽る暇があったら、ハァ ? と指摘されてるところを見直したらどうか。

> あと、何を誤解してるか知らんけど、>>327 != 310 ね。

あんたが引用してるから、あんた宛に書いただけのことだけど。
366336:04/02/10 22:51
>>361さん
仲間仲間〜 ヽ( ̄▽ ̄)ノ


・・・いや、そーじゃなくて。
SP5入れても治んないのかー。落とすの面倒だし、入れなくてもいっか。

とりあえずOS再インストしてみるです、自分も。
>>365 は天然ですか?
だろうね。もう完全に周りが見えなくなってる。
369347:04/02/10 23:25
やっぱりできないよー助けて!
370361:04/02/10 23:27
>>364
スルーしてくだちい_| ̄|○
VCやってる奴ってこんなんばっかかよ
>>371
悪い奴が目立つだけ
>>367=>>368=>>331 と言うことで FA ?
>>363
ネットワーク・プログラミングのコード例見れば必ずやってあることだが
#ifdefで条件分岐してhtonsやhtonlをかけるかどうか使い分ける
>>374
htons, htonl 使ってて、#ifdef で条件分岐してる奴って頭おかしいと思うのは俺だけか ?
(つーか、質問者の意図 (=Cソースを直さずに) を無視してるし...。)

>>363
ソース見ないとなんとも...。
エンディアンが問題となるところで htons 相当の手当てがしてあるなら、その定義を書き換えればいいけど、生でキャストしまくられていたらソース書き換えられないとどうしようもない。
外に出さなきゃ問題ないけどな
たいていはネットワークやファイルに出してるから無理か・・
377デフォルトの名無しさん:04/02/11 15:29

エクスプローラで、/ なんかのファイル名を指定すると
ファイル名として指定できない文字の一覧が表示されますけど、
あれの コロン : とアスタリスク * の間の2文字はなんでしょう?
コンマとセミコロンかと思ったんですが、どうもこの文字は
ファイル名として指定できるみたいで。

分かる方いませんか?
コロンとアスタの間に文字なんて無いぞ・・・
XPでNTFSだけど
379デフォルトの名無しさん:04/02/11 15:39
コンマとセミコロンがあるぞ
2000でNTFSだけど
? " / \ < > * | :

コンマとかセミコロンは(Vではない)FATで使えない文字だと思う。
これってどっかでdefineされてんのかな?
>>379
うちは 2000 + FAT32です。
2000だとあるんですかね。

\ / : , ; * ? " < > |

こんななってる。

>>380
VFATなんての、ありましたっけ?
聞いたことあるようなないような・・・。

ファイルパスをParseするクラスを作ってるんですが、
2000以上なら , ; は使えると考えていいんかなー?

参考になりますた。
どもです。
---------------------------
名前の変更
---------------------------
ファイル名には次の文字は使えません。

\ / : , ; * ? " < > |
---------------------------
OK
---------------------------

どうでも良いことだけど、Win2000 以降では
ctrl-C でダイアログボックスのテキストがコピペ出来る
>>381
>ファイルパスをParseするクラスを作ってるんですが、

せっかく車輪の再発明をしてるところなのに申し訳無いんだが
Windows Shell API つーので Parse 出来る分けだが。

http://nienie.com/~masapico/api_index.html
ここの Path から始まる API 群。。

Windows NT/2000: Requires Windows 2000 (or Windows NT 4.0 with Internet Explorer 4.0 or later).
Windows 95/98/Me: Requires Windows 98 (or Windows 95 with Internet Explorer 4.0 or later).
Header: Declared in Shlwapi.h.
Import Library: Shlwapi.lib.
>>384
お、どもども。

アスキーのWin32APIオフィシャルリファレンスに載ってなかったので
ないのかと思いました。Platform SDKの全訳が欲すぃ・・・・。
>>384
Win9xだと"*HOGE*"を照合できないし、
UNCの判定とか機能不足しすぎ。
\\HOST\A\B\Cだとマウントしてからディレクトリを移動せんと。
どなたかVC++で出たエラーなどの解決方法を教えてくれる。
スレッドがあったら教えていただきませんか?
388336:04/02/11 22:28
336でございます。
林ハルヒコさんのVC本、立ち読みしてきました(買えよ自分)

載っていた解決策:
 VC5→ヘルプだか検索だかしる
 VC6→Ctrl+Cを押す



… 駄目でした_| ̄|○
ずっとstandard ed.使っているけど
そういう現象には一度も遭遇してないなあ。
バージョンによって違うのかな。
ちなみにNTで使っているけど。
391デフォルトの名無しさん:04/02/12 11:32
void ShowMyText(HWND hWnd)
{
HDC hdc;
PAINTSTRUCT paint;
char *str = "こんにちは";

hdc = BeginPaint(hWnd, &paint);
TextOut(hdc, 10, 10, (LPCSTR)str, strlen(str));
EndPaint(hWnd, &paint);
return;

}

上のは文字しか表示できないのですが
printf("a + b = %d\n", a + b);
みたいに数字を表示させるにはどうしたらいいのですか?

>sprintfでも使ってなさい
と他スレで返答いただいたのですがスレ違いだったのでこっちで質問します

sprintfをしらべたのですが、数字を表示できそうにありません
sprintfをどのように使えば数字を表示できるのですか?



まず Windowsの描画の仕組みが全然わかってない
まずはコンソールでやってはいかがか

sprintf なら、
char str[100];
sprintf(str,"こんにちは %d", 1);
以下同文
ってこれ、「猫でも・・・」での例なのか
いいのかこんな例出して
>391
sprintf作った奴が聞いたら泣くだろうな。(笑

まず、printfとかsprintfをシャブリ尽くしていろいろ試そう。

395デフォルトの名無しさん:04/02/12 12:05
>>392
ありがとうございました
できました
>>393
そうです
なんでわかったのですか?
>>394
printfはコンソールでしかつかえないんですか?
396デフォルトの名無しさん:04/02/12 12:28
>宣言時に初期化するのでかまわなければ、
>int data[100] = {0}; のようにすると、全ての要素に{0}を設定できますよ。
と調べたら出てきたのですが、上のようなやり方で2次元配列の場合はどのように宣言したらいいのでしょうか?

int data[5][5] = {1};として初期化してもダメでした
>>391
void ShowMyText(HWND hWnd)
{
HDC hdc;
PAINTSTRUCT paint;
int a = 10;
int b = 100;
CString str;
str.Format("a + b = %d\n", a + b);

hdc = BeginPaint(hWnd, &paint);
TextOut(hdc, 10, 10, (LPCSTR)str, str.GetLength());
EndPaint(hWnd, &paint);
return;

}

これでもできる。
>>396
int data[5][5]
ZeroMemory(data, sizeof(data[][]));

ゼロの場合はコレで初期化できるかな?
試してないんだけど。
配列のsizeof は名前だけでいいよ。
sizeof (data)
400デフォルトの名無しさん:04/02/12 12:51
>>397
いっぱいエラーが出て確認できませんでした
>>398
0で初期化されてたようです
MFC使ってないんだと思われ

Paint系は、引数をHDCにして、WM_PAINT でBeginPaint()して
得たHDCを渡すようにすると、自力で描画する場合にも
同じ関数が使えるぞ、、、ってとりあえず現状では無理か・・・
>394
少し戻って変数の型とかの部分をよく見てやり直しておいた方が良いよ
今のうちに。

char からintとか、その逆への変換は基本中の基本だから。
後、猫プロはとりあえず出来る方法を紹介していて、理屈は
とばしてるところもあるので、別のサイトや本もよまないと
自力で書けるようにならないよ。
visual C++6.0で
#include <stdio.h>
int main()
{
int a=1,b=1;
printf("AたすBは%dです。",a+b);
return;
}
ってのをコンパイルしました。
そしてビルドを押すと「リンク中...」とでたまま操作不能になってしまいます。
これを解決するにはどうすればいいのでしょうか、
この症状が出た人は多数いるようですが、解決策が無いようなので
やっぱり解決することは不可能なんですか?
それとも
ソースがいけない、使い方が悪い...とかの事ですかね
ん?デジャヴ?
>>403
VS起動しなおしてみて。悪いのは多分MS
>>403
それでハングするってのはオカシイね。
return で値を返してないからコンパイルエラーになるとは思うけど。
ソースの問題ではないと思われ。
407391:04/02/12 18:26
>>401
MFCは使ってませんでした
>>402
見直してみます

アドバイスありがとうございました
LINKが返ってこなくなるのは何年も前に食らった
まだ直ってないのか・・・

終了しようにもビルド中で終われなくてビルドの中止は
無視されるんだよな。
409デフォルトの名無しさん:04/02/12 19:21
VC++って良く知らないんですが、ANSICの関数は全て使えるんですか?
>>409
使えると思う。
411391:04/02/12 19:42
char str[100];
sprintf(str,"こんにちは %d", 1);



char str[100];
wsprintf(str,"こんにちは %d", 1);

としても同じ結果になったのですが
sprintfとwsprintfはなにが違うのですか?
>>411
Cの標準ライブラリとして実装されているか、
WindowsのAPIとして実装されているかの違いなのかな?

strcpy と lstrcpy
strcmp と lstrcmp なんてのもあります。
調べろ
414413:04/02/12 19:57
ああ、初心者向けだった
すまん
415デフォルトの名無しさん:04/02/12 20:08
>>412
WindowsのAPIでプログラムするときはwsprintfを使った方がいいのでしょうか?
>>414
いえいえ
>>384
うーん。やっぱ自分で作ったやつより、
MSの用意した関数は使いやすいわ。
ありがたう!

しかしこういう関数を作るためのWindows側の細かい仕様
をまとめた冊子って出てないのかな。なんとなくは分かっ
ても関数を書くとなると、やっぱ厳密に知らないと書けない。
>>403
OSがXPだったり?
extern について詳しく解説してるサイト教えてください。
実行時エラーで仕事が進みません。
>>415
俺はなんとなく strcmp よりも lstrcmp 使っちゃうねぇ。
sprintf は使ってないからわからんです。
CString 使っちゃうので。

同じ動作をする関数がいくつもあるのを知ったときは
そういうのは混乱するからやめてくれ!と思った。
>>418
コンパイルとビルドはできるわけ?
だったら extern なんて関係あるんだろうか?
421デフォルトの名無しさん:04/02/12 20:38
ソースを書け。
でないと、わからん。
422デフォルトの名無しさん:04/02/12 20:44
>>410
ありがとう
423デフォルトの名無しさん:04/02/12 21:00
ShowWindow(hWnd, nCmdShow);
としても
ShowWindow(hWnd, SW_SHOW );
としてもウインドが表示されるのはなぜですか

ShowWindow(hWnd, nCmdShow);の第二引数にSW_SHOWを指定しなくてもウインドが表示
されるならSW_SHOWの存在意味がないようなきがするのですが
>>423
nCmdShow に SW_SHOW が入ってんでしょ。
SW_SHOWが実は数字だってことは分かってます?
425デフォルトの名無しさん:04/02/12 21:20
>>424
>nCmdShow に SW_SHOW が入ってんでしょ。
nCmdShowにSW_SHOWが代入されてる行はありませんでした
これはどういうことなのでしょうか?
>SW_SHOWが実は数字だってことは分かってます?
知りませんでした、カーソル合わせると#define SW_SHOW 5って出てきました
>>425
nCmdShow は WinMain の引数になってない?
ここで代入されてんだよ。

ユーザーが引数を設定して関数を呼び出すように、
WinMainもどこからか呼び出されて動作を始める
わけさ。

427デフォルトの名無しさん:04/02/12 21:38
>>426
WinMain の引数になってました
WinMainがどこからか呼び出されて引数としてnCmdShowを貰うときにには常にnCmdShowの中にSW_SHOW
がすでに代入されているんですか?
428デフォルトの名無しさん:04/02/12 21:41
if (!RegisterClass(&myProg))
return FALSE;
の中の!RegisterClass(&myProg)はどういう意味なのでしょうか?

>>427
小人さんはだいたいはSW_SHOWを入れるようだが
クライアントの希望によっては他の値も入れることがあるらしい。
nCmdShowは所詮変数。いつも同じ値とは限らない。
SW_HIDEのときもあるだろう。
>>415
体感では分からんかもしれんけど、昔実行速度計った結果によると
 wsprintf > sprintf
 lstrcpy < strcpy
 lstrlen > strlen
だったんで strcpy以外はAPIの方使うようにしてる。ただwsprintfは浮動小数点
が使えないので、そんときだけsprintf。
431デフォルトの名無しさん:04/02/12 22:33
>>429
>>430
ありがとうございました
>>430
VC++ 6.0 でやってみた。

wsprintf > sprintf
lstrcpy < strcpy
lstrlen < strlen

wsprintf 以外はCランタイムの方が速い。
wsprintf が速いのはバッファが1024byte固定だからか?
433432:04/02/12 23:38
遅くても、Win API の方を使ってしまう漏れ。
エディットボックス(m_Day)にyyyy/mm/ddの形で入力するところで困ってます。
yyyyをmmを入力したら自動的に/を入れてくれるようにする為下記のようなものを
作ったのですが/が入ったあとカーソルが自動的にエディットボックスの一番最初
の文字の前に行って困ってます。
どのようにすればカーソルを移動しないようにできるでしょうか?

switch(m_Day.GetLength()){
case 4:
if(m_Day.GetAt(3) != '/'){
m_Day = m_Day + '/';
}
break;
case 7:
if(m_Day.GetAt(6) != '/'){
m_Day = m_Day + '/';
}
break;
default:
break;
}
m_No = m_No.Left(10);
>>434
m_editになってるけどCStringで変数設定してるようだが?
まず「値」でなく「コントロール」でCEditで変数を作る。
値だと中身しかいじれないから。

CEdit m_edit;
m_edit.SetWindowText("0123456");
m_edit.SetSel(7,-1);
m_edit.SetFocus();
436デフォルトの名無しさん:04/02/13 06:09
a[-1][-1]=1
とかいうように配列にマイナスも使えるのはなんでですか?
>>436
使えなくするほどの積極的な理由がないからじゃないですか?

a[10]; で宣言して a[15] みたいな配列を超えるアクセスも
言語上は許されていますし。
438デフォルトの名無しさん:04/02/13 06:58

MFCプロジェクトでスレッドからの通信用に
ユーザー定義のウインドウメッセージを定義しようと
思うんですが、BEGIN_MESSAGE_MAP( ) で
ON_WM_USER_DEFINED_MESSAGE( )
のように簡単にハンドリングすることはできるんでしょうか?

また、メッセージマップはどの辺で定義すべきでしょう?
新しいファイルを使うのか、既存のファイルが使えるのか。

アドバイスいただけるとありがたいです。
439デフォルトの名無しさん:04/02/13 07:19
>>437
>a[10]; で宣言して a[15] みたいな配列を超えるアクセスも言語上は許されていますし。

上の場合a[15]=1;とか数値を代入してしまうと、a[10];の宣言で取ったアドレス
以外のアドレスに1が書き込まれて、暴走してしまうとかもありうるのでしょうか?
int a[10]; // 配列確保
a[0] = 1; // 問題なし
a[9] = 1; // 問題なし
a[15] = 1; // アクセス違反 暴走の元
a[0] = 1; // 問題なし だが、上でアクセス違反をしているので 保証はしない。

この程度なら 暴走まではいかないが やっかいなバグの原因になる。(発見しにくい)
文法上問題ないのでコンパイルは通る。
実行もできる。
ただ、何が起こるか保証しない。
>441
ローカル変数なら暴走しない事の方が多いけど、
引数でそれをやると、暴走する事の方が多いと思う。
>>436
他の言語と違って[]は演算子だから。
暴走というより、他の変数とかぶって
いつのまにか値が変わったりするんでやっかいなバグが出るな
445デフォルトの名無しさん:04/02/13 10:21
CPPファイルを機能単位に分割してるんですが
common.hに記述するのはほとんど全部のCPPファイルで共有されている
ののだけでいいのでしょうか?

たとえば、5つのCPPファイルに分割されてる場合
その中の2つのCPPファイルにしか共有されてないもの
であってもcommon.hに書いといたほうがいいのでしょうか?
>common.hに記述するのはほとんど
とりあえず型宣言とかそーゆー類だと仮定しておく。

で、特に問題ないんじゃね?
あくまでも、ソースの中に○○が出てきたらxxしてね、っていう注意書きみたいなもんだし
問題あるようなら、2つだけからしか参照しないヘッダを作ればよし。



・・・というような回答例を
C言語の入門書を読みおえたばかりの俺は思いついたんですが、いかがでしょうか。
参照してるかどうかより、意味的にcommon がふさわしければ入れればよい
448デフォルトの名無しさん:04/02/13 11:28
>>446
宣言とか変数やインクルードなどの共有です
>2つだけからしか参照しないヘッダを作ればよし。
そういうこともできるんですね
参考になりました
>>447
共有できるのなら入れていいんですね
449デフォルトの名無しさん:04/02/13 12:05
int a[5][5];

//-----------------------------------------------------------------------------
// 関数名 : GameInit()
// 機能概要: スタート処理初期化
//-----------------------------------------------------------------------------
int i,h;
for (i=0;i<5;i++)
{
for (h=0;h<5;h++)
{
a[i][h]=0;
}
}

a[4][4]=1;

//-----------------------------------------------------------------------------
// 関数名 : StartFrame()
// 機能概要: 画面更新処理
//-----------------------------------------------------------------------------
if (a[4][4]==1)
{

g_FrameNo = START_INIT;

     }

ではStartFrame()内でa[4][4]には1が入っていませんでした
450デフォルトの名無しさん:04/02/13 12:09
でも

int a[5][5];
//-----------------------------------------------------------------------------
// 関数名 : GameInit()
// 機能概要: スタート処理初期化
//-----------------------------------------------------------------------------
int i,h;
for (i=0;i<5;i++)
{
for (h=0;h<5;h++)
{
a[i][h]=0;
}
}
//-----------------------------------------------------------------------------
// 関数名 : StartFrame()
// 機能概要: 画面更新処理
//-----------------------------------------------------------------------------
a[4][4]=1;

if (a[4][4]==1)
{
g_FrameNo = START_INIT;
}

とするとa[4][4]に1が入ってました

関数をまたぐ間にa[4][4]の内容が変わってしまったのでしょうか?
これ以外のところではまったくa[][]をいじってないのですが…
なんでこんなことになるのですか?
>>450
その記述した行がどこにあるのかわかる様に書いてくれ
関数の中なのか外なのかさっぱりわからん・・・
452デフォルトの名無しさん:04/02/13 12:45
表示させたビットマップをテンキーで動かすプログラムを作りました
しかしビットマップの動きが早すぎるのでこま送りぐらいのゆっくりした動きにしたいので
ウェイトをかけたいのですがどうしたらよいのでしょうか?
>449
俺俺スレで解決したんじゃねーのかよ。
>448
ファイル間の変数の共有はやめとけ。
454デフォルトの名無しさん:04/02/13 13:14
>>451
後なにを書けばよいのですか?
わかりにくくてすみません
>>453
a[4][4]=1;をGameInit()ゲーム初期化関数の方に書きたいのですが
そうするとちゃんと1が代入されていないみたいなのでまだ困ってます

455449:04/02/13 13:23
>>451
>>453
グローバルにint a[5][5];を書いたあとにGameInit()
内にもint a[5][5];を書いてました
GameInit()内のint a[5][5];を消したらうまいこといきました
どうもお騒がせしました

       ヽ(・ω・)/   ズコー
      \(.\ ノ
457デフォルトの名無しさん:04/02/13 16:25
HWND_TOP とか HWND_BOTTOM とかSWP_SHOWWINDOW
などの16進数の数値って、どうやって知ることが出来るでしょうか?

以前某所で別のスイッチの16進数を見たことあったんだけど、そこ
つぶれちゃってて・・・
すみません、ご教授お願いします<(__)>
>>457
VC++の話?
>>457
ヘッダ見れ。
ソース中でそれにカーソル置いてF12とかすれば一発でジャンプしてくれるよ。
460457:04/02/13 16:37
458様、459様、ありがとうございました。
解決しました。
(459様の手順を使わせていただきました)
461434:04/02/13 17:05
>>435
レスありがとう御座います。
おかげで解決できました。
SetSel()の使い方がまだよくわかりませんが勉強します。
ありがとう御座いました。
>>427
最初のShowWindow()呼び出し時のみ引数の値は無視され、デフォルト値が使われる。
>>462 ソースは?
>>462
タブコントロールの子ウインドウで明示的に
はじめから ShowWindow(SW_HIDE) にしてるけど、
ちゃんと隠れてるよ。
>>427
多分、VBのShell関数などでwindowstyleを指定できる。
プロセス呼び出しの際に親プロセスがnCmdShowを指定できるんじゃなかったっけ?
親に該当するプロセスがない場合はSW_SHOWになるんだと思う。

違うかなぁ・・
>>466
日本語でおながいしまつ
親(呼び出し元)がいないって、、、自然発生するプロセスがあるのか

エクスプローラから呼び出す場合ってことだろうけど、
ここで nCmdShow を指定することってできないんだっけ?

>>463-464
MSDN読みませう。
あとMFCの場合、裏で初回のShowWindowが呼ばれていたりする。
472デフォルトの名無しさん:04/02/13 21:15
キーボードフックをしておいて
MSNメッセとかでチャット中に
あるキーを押したら
AAを書いておいたファイルからAAを読み込んで
メッセの現在のカーソル位置にAAを挿入する

ということをしたいのですが
他のプログラムのカーソル位置にテキストを貼り付ける
にはどうすればいいのでしょうか
coutとか標準出力に出力しても何も起こりませんでした
>>471の内容でどうして>>462の文章になるんだ・・・
プロセスの起動方法が違うじゃねーかよ
475デフォルトの名無しさん:04/02/14 00:29
ビットマップ上の任意の点の色を調べる関数ってあるのでしょうか?
GetPixel
>>475
無い
ビットマップファイルだけなら作ったほうが早そう

??
Win32Consoleプログラムを製作しているものです。

出力をクリップボードにしたいんですが、どうやったらいいんでしょうか?
CopyToClipboard(CString str)
{
HGLOBAL hGlobal;
LPTSTR lpStr;
hGlobal = GlobalAlloc(GHND, str.GetLength() + 1);
if(hGlobal == NULL)
return;
lpStr = (LPTSTR)GlobalLock(hGlobal);
lstrcpy(lpStr, str);
GlobalUnlock(hGlobal);
if(!OpenClipboard()){
GlobalFree(hGlobal);
return;
}
EmptyClipboard();
SetClipboardData(CF_TEXT, hGlobal);
CloseClipboard();
}

こんな感じで適当に改造
BOOL型でTRUEかFALSEで返るようにするとか
Freeしちゃあかんでしょ・・・
あ、インデントつまってただけか。スマソ
>>471こっちです
ttp://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpwinui/html/_win32_showwindow.asp
>>473解説をまとめただけです、要約のへたれはお許し下さい。
ShowWindow 関数の初めての呼び出しでの nCmdShow パラメータの値は無視されます。
この場合、ShowWindow 関数は、STARTUPINFO 構造体で指定された値を使ってウィンドウを表示します。
以降の呼び出しで、アプリケーションを起動したプログラムが提供した起動情報を使うには、nCmdShow パラメータを SW_SHOWDEFAULT に設定します。
>>479
>>480のに、追加で
#include <windows.h>

VC++はこれだけでいいと思うけど、リンクエラーが出るなら
user32.libのリンクも追加
485デフォルトの名無しさん:04/02/14 04:03
>>476
ありがとうございました
>>477
GetPixelでいけそうです
486デフォルトの名無しさん:04/02/14 04:33
Wizardでデフォルト設定のまま作ったSDIプロジェクトで
CMainFrame::PreCreateWindowが起動時に二度呼ばれてみるみたいなのですが
何のためにどこから呼ばれてるのでしょうか?

感覚的にウィンドウ毎に一度しか呼び出されないと思ってたので意外で・・・。
487デフォルトの名無しさん:04/02/14 06:45
COLORREF GetPixel(
int x,
int y
) const throw( );
は、ピクセルの RGB 値 (赤、緑、青の成分値) を返すそうですが
かえされたRGB値を画面に表示するにはどうしたらいいのですか?
RGB値の受け渡す方法がよくわからないです
#include <wingdi.h>

BYTE red,blue,green;
COLORREF col;
HDC hdc;
...
col = GetPixel(hdc,x,y); // WINAPI32
red = GetRValue(col);
green = GetGValue(col);
blue = GetBValue(col);

col = RGB(red ,green, blue );
...
489デフォルトの名無しさん:04/02/14 07:50
...
HDC PaintDC;
BYTE red,blue,green;
COLORREF col;
col=GetPixel(PaintDC,0,0);// WINAPI32
red = GetRValue(col);
green = GetGValue(col);
blue = GetBValue(col);
char str[100];
sprintf(str,"%d", red);
...
とするとchar str[100];のところで構文エラー : ';' が '型' の前にありません
というエラーがでます
...
HDC PaintDC;
BYTE red,blue,green;
COLORREF col;
//col=GetPixel(PaintDC,0,0);// WINAPI32
//red = GetRValue(col);
//green = GetGValue(col);
//blue = GetBValue(col);
char str[100];
sprintf(str,"%d", red);
とするとエラーが出なくなります
なぜでしょうか?
...
拡張子を.cppにしろ
491デフォルトの名無しさん:04/02/14 10:47
>>490
.ccpにしてますよ
ccb
ここある意味いい問題集だな
494472:04/02/14 13:19
>>480
ありがとうございます
非常に参考になりました
495デフォルトの名無しさん:04/02/14 14:01
>>490
すいません.cppにしてませんでした
.cppに変更したら
Winmain.obj : error LNK2019: 未解決の外部シンボル _WindowProc@16 が関数 _WinMain@16 で参照されました。
.\Debug/chap38.exe : fatal error LNK1120: 外部参照 1 が未解決です。
と出てきました

ヘッダを読み込んでない。
かっこの対応がとれていない。
関数が悪い。
のどれか。
497デフォルトの名無しさん:04/02/14 15:10
>>496
ありがとうございました、ちゃんとできるようになりました

あとGetPixel(PaintDC,0,0);を

PaintDC=BeginPaint(hwnd,&ps);
GetPixel(PaintDC,0,0);
BitBlt(PaintDC,0,0,200,200,MemoryDC,Ac*200,0,SRCCOPY);
このようにすると色の値が取れてないようで
PaintDC=BeginPaint(hwnd,&ps);
BitBlt(PaintDC,0,0,200,200,MemoryDC,Ac*200,0,SRCCOPY);
GetPixel(PaintDC,0,0);
このように並べ替えるとちゃんと色をとるようになったんですがなぜでしょうか?
498デフォルトの名無しさん:04/02/14 15:34

MFCでプログラミングしてます。

憂鬱なんかだとクラスを作って、そのクラス間の
連携をしながらプログラミングをしていくみたいな
ことが書いてあったんで、できるだけそれを
意識してやってるんですが、なかなかそういう
理想通りにはいかないなぁという印象。

特に気になっているのが、関数のアドレスを引数に
取る関数で、ファイルコンペアとか、AfxBeginThread
なんかがそうですが、関数のアドレスを渡すとなると
クラス内でstaticで関数を宣言するか、グローバル関数
にするしかなくなってしまいますよね。

なんとかうまくクラスとして使うコツなんてないんですかね。
クラスのstaticメンバ関数だと名前空間で宣言したのと
大差がなくなって、通常の非staticメンバ関数へのアクセスが
容易じゃなくて使いづらい。

なんとかすっきりと解決する方法ないのかな。

>>498
私はthreadの場合はこうしている。
#ありえないコードだけどわかるよね。

class CAnyDlg : public CDialog
{
CAnyDlg() {AfxBeginThread(someThread, this);}
static UINT someThread(LPVOID pParam);
int someMember;
};

UINT CAnyDlg::someThread(LPVOID pParam)
{
CAnyDlg * pThis = (CAnyDlg *) pParam;
return pThis->someMember;
}
>>499
なるほど。ありがとうございます。
staticメンバ関数にthisを渡すのは良い方法かもですね。
参考になりました。
VC7ではstaticでないメンバ関数を渡せるみたいなことをどっかで見たことがあるが...

>>500
>>499みたいに別スレッドにMFCオブジェクトの thisを渡す方法はイリーガル。という
か、動作自体しないことがあったり、不可解な動作をしたりなので、全く良い方法では
ない。CWnd関係のポインタなんか、特にそうじゃないかと。

詳細はMSDNの「マルチスレッド : プログラミングのヒント」参照
>>501
>499だけど、それは承知している。
あくまでもオブジェクトからその他のクラスに紐付けるために使っているから安心してくれ。
503デフォルトの名無しさん:04/02/14 22:13
CD-ROMに存在するテキストファイルを fopenします。
CDを取り出します。
この状態で fgetsしても文字列が取得できるんですけど
なぜなんでしょう?
>>503
入力バッファに読み込まれてるからだろ。
fgets() するたびにデバイスから読んでたら遅くなるから、適当な単位で (物理ブロックサイズ) で読み出して必要部分だけをユーザープログラムに渡すのが普通。
>>504
それって一回でも入力処理を行わないといけないんじゃないの?
506503:04/02/14 22:43
>>504
ありがとうございます。
ただ、>>505さんのいわれるとおり、一度も読み出していない
ものまで読めるのが不思議なんです。
fopenの時点でバッファリングされるのかな?
autorun.infみたいにマウント時に自動的に読んでいたりして。
fopenはファイルをstream結びつけて読み書きできるようにする関数。
fseekしたり、freadや、fgetsで、streamのバッファを読み書きしてる。
fopenした時点でバッファリングされてます。

openだと、ファイルハンドルで読み書きする。
こっちはlseekして、readで読み書きする。
openしただけではバッファリングされません。

DOSだとこんな感じだったけど。処理系依存かも。
509503:04/02/14 23:32
>>508
ありがとう。なるほどーっす・・・
バッファリングって、概念としてはなんとなくわかるけど
実体がよくわかりません。詳しく解説してる書籍などありますか?
Win32コンソールプログラムで

ドラッグアンドドロップでファイルを開く機能を実装するにはどうしたらよいでしょうか?
>>509
ソースに勝る解説書無し
512デフォルトの名無しさん:04/02/15 02:44
ビルドしようとすると、ウィンドウプロシージャ内のデフォルト処理、
default:
 return DefWindowProc(HWND, UINT, WPARAM, LPARAM);
の部分で、
error C2275: 'HWND' : typedef 識別子に、クラス メンバ アクセス演算子 (->) を使用しました。
というエラーメッセージが出ます。これがどういうエラーなのかが分かりません。
色々いじってみましたが、一向にエラーは消えません。健闘がつかなくなりました。
分かる方いらっしゃいましたら、ご教授お願いします。

環境は、VC++6.0です。
君は2の平方根を計算したい時に a = sqrt(double); と書くのか
514512:04/02/15 03:06
>513
それは書きませんが…。どういうことなのでしょうか。
変数名がおかしいということですか?
どうしてこのスレの人たちはイジワルな答え方ばかりするの?(つД;)えーん
516デフォルトの名無しさん:04/02/15 03:31
CWndの派生クラスをnewしてもそれはスレッドを生成したことにはならないんですよね?
なんかウインドというとスレッドがおまけについてくるみたいに思ってました。
517デフォルトの名無しさん:04/02/15 03:34
>>512
HWNDなどは型です。
型を引数にして関数呼び出しはできないよ。
CreateProcess()からrshコマンドを呼び出しています。
一応動作するのですが、処理時間が長いと
3分程でreadエラーと標準出力に表示され
rshコマンドの接続が切れます。
なぜかrshコマンドに-nオプションをつけると無問題です。
これってCreateProcess()の呼び出し方が悪いんですかね?
519デフォルトの名無しさん:04/02/15 06:00
ビットマップファイルから直接、任意の座標のRGB値を読み込むにはどうすればいいのですか?
・・・自前でファイル読み込み?
ヘッダ読めば任意の座標のRGB値がどこにあるかわかる
パレット使った256色や、上下ひっくりかえってないマイナスの高さのやつに注意
522デフォルトの名無しさん:04/02/15 10:35
すみません、なんか昨日から謎の現象が起こるようになったので
質問させてください。環境はVS.NET 2003です。
プロジェクトに.cppファイルを追加してコンパイルしようとすると

hoge.cpp(1) : warning LNK4017: #include 文はターゲット プラットフォームでサポートされていません。無視しました。
hoge.cpp(3) : warning LNK4017: int 文はターゲット プラットフォームでサポートされていません。無視しました。
hoge.cpp(4) : warning LNK4017: { 文はターゲット プラ(ry

と、警告が大量に(っていうか行数分)発生するのでつ。
警告だけで実行には問題ないっぽいのですが、大量すぎて気持ち悪すぎるので。

コンソールだろうが、Win32だろうが、MFCだろうが関係なく発生します。
何故かプロジェクト作成時に自動生成されたファイル構成のままの時は
リンカもおとなしくしてくれてるんですが。。。謎。
どなたか原因or治療法をよろしくです。

ちなみに関係ないかもしれないですが、
昨日DirectXのSDKを入れた前後くらいから起こりだしたです。
523デフォルトの名無しさん:04/02/15 12:02
>>520
はい、自前でしたいんです
>>521
http://www.kuwalab.net/technics/bitmap/
>BITMAPFILE HEADER
>BITMAPFILE HEADERの内容
>オフセット バイト数 構造体フィールド名  説明
>0000     2    BfType        ファイルのタイプ、ビットマップを示すBM(0x424d)が入ります。
>0002     4    BfSize        ファイルのバイト数。ファイルのサイズの情報が入ります。
>0006     2    BfReserved1      予約域。値は、0x00が入ります。
>0008     2    BfReserved2      予約域。値は、0x00が入ります。
>000A     4    BfOffBits       ファイルの先頭から、画像情報までのオフセット。普通は0x36が入っています。
http://www.kk.iij4u.or.jp/~kondo/bmp/
>32 bit (1677万色) Bitmap
>このフォーマットにはカラーパレットがありません。
>1画素あたり 32bit (4byte) で,Blue(8bit), Green(8bit), Red(8bit), Reserved(8bit)
>の順番で色の値が記録されています。Reserved には '0' が入ります。

ビットマップファイルの000Aで画像情報の開始アドレスを取得して
そのアドレスから4byteごとにピクセル情報を見ていけばいいのでしょうか?
初心者なのでまだファイルの読み出し方法がわからないのでもう少し調べてみます

アドバイスありがとうございました




リンカ ツールの警告 LNK4017
keyword 文はサポートされていません。無視されます。
モジュール定義ステートメントは、このバージョンの リンカ ツール
ではサポートされていません。.DEF ファイル内のこのステートメントは
無視されました。
525天野:04/02/15 15:34
天野っす。

VCってリアルタイム処理したら、
どのくらいの周波数まで保障されますか?
OS と 実行するマシンによる。
527天野:04/02/15 16:50
>526
天野っす。

OS:98で、スペックは2.0GHz
それか
OS:XPで、スペックは2.0GHz
です。
質問なんですが
分割コンパイルをするにはどうしたらいいんでしょうか?
コンパイラはvisual C++6.0です。
ソースファイルを分ける
-c つけてコンパイルする
ワークスペースのファイルの上で
右クリックメニューを出して
コンパイル
>>527
CE を除く Windows では、その手の「保証」はない。
また、あんたや俺の生活を「保障」してくれるわけも無い。
ましてや、「補償」なんて考えることすらできない。
532522:04/02/15 18:07
>>524
LNK4017の説明はMSDNで読んだんですが、プロジェクトに.defは無いんですよ。
ていうか、.cppで警告されてるんでなお意味が分からず。
つか、以前に正常にビルドした他のプロジェクトを試しにリビルドしてみたり、
他人のソースコードをビルドした時にも発生するんで、謎が深まるばかりで。
>529-530
出来ました。ありがとうございます。
534523:04/02/15 23:59
FILE* fp;
fopen("mapdata.bmp","rb");
char a ;
if (fp==NULL)
{
return -1;
}
fseek(fp,0,0);
fread(&a,4,1,fp);
fclose(fp);

とすると
sample.exeの0x004017feでハンドルされていない例外が発生しました:0xC0000005:
場所0x77cf5ca0に書き込み中にアクセス違反が発生しました。。

とエラーがでましたどうしてでしょうか?
FILE* fp = fopen("mapdata.bmp","rb");

最初の2行だけ読んで即レスしてみるテスト。
536デフォルトの名無しさん:04/02/16 00:16
>>535
変更してみましたが実行中に

sample.exeの0x00401506でハンドルされていない例外が発生しました:0xC0000005:
場所0x0000000cに書き込み中にアクセス違反が発生しました。。

と出てfclose.cの

/* Init near stream pointer */
stream = str;

if (stream->_flag & _IOSTRG) {
stream->_flag = 0;
return(EOF);
}
にカーソルが表示されます
537デフォルトの名無しさん:04/02/16 00:19
fread(&a,4,1,fp);
aは一バイトだろ
539デフォルトの名無しさん:04/02/16 00:20
>>535
あと、char a ;をint a;に変えたらできました

ありがとうございました
540デフォルトの名無しさん:04/02/16 00:21
>>537
>>538
ありがとうがざいます
541デフォルトの名無しさん:04/02/16 00:23
Perlじゃねーんだから、きちんとSEEK_SETマクロを使えよな。つーか無意味。
542デフォルトの名無しさん:04/02/16 00:24
win2kのあるシステムファイルが
ほかのどのdll等を使用しているのか
調べるにはどうしたらいいですか。
昔vc++6を買ったもののすぐに飽きて
押し入れに入れっぱなしになってますが
これで調べられますか。
543デフォルトの名無しさん:04/02/16 00:25
並列処理プログラムをVisualC++でやりたいのですがどうすればできるのでしょうか?
参考書などあればお願いします。
>>542
Dependency walker を使うですよ。
ダイナミックロードしてるDLLは出ませんですが。
>>544
ありがとです
あとは検索してみます
http://www.dependencywalker.com/
VCについてるツールの最新版
ダイナミックロードしているファイルも解析できます
547デフォルトの名無しさん:04/02/16 02:53
FILE* fp;
fp=fopen("mapdata.bmp","rb");
char str[100];
int a ;
if (fp==NULL)
{
return -1;
}
fseek(fp,54+(40*29)*3,0);
fread(&a,1,1,fp);
fclose(fp);
sprintf(str,"%d", a);
TextOut(PaintDC, 300, 300, (LPCSTR)str, strlen(str));

FILE* fp;
fp=fopen("mapdata.bmp","rb");
int a ;
char str[100];
if (fp==NULL)
{
return -1;
}
fseek(fp,54+(40*29)*3,0);
fread(&a,1,1,fp);
fclose(fp);
sprintf(str,"%d", a);
TextOut(PaintDC, 300, 300, (LPCSTR)str, strlen(str));

ではaの値が違うのはなぜでしょうか?

>>547
a はint だな?
int だから4バイトの領域があるのに、1バイトしか読み込んでない。
残りの3バイトはゴミが入ってる。
場所を変えたらゴミの内容も変わる
>>548
547の後者の方には正しい値が入っているのですが
前者は全く違う値が入っています

1バイト分のデータしか必要ないので1バイト分しか読み込んでないのですが
どうすればint aの位置を変えても常に正しい値が得られるのでしょうか?
>>549
事前にゴミを消す。int a = 0; で初期化する
というのが答えだが、そもそも1バイト読むなら unsigned char にすべきかな
目的と違うからわかりにくいし、cpuのエンディアンに依存したやりかたはよくない

seek も、0じゃなくて SEEK_SET と入れような
>>541
>>550
ありがとうございます
うまいこといきました
552デフォルトの名無しさん:04/02/16 09:36
>>546
ささささささんきゅうでっす!!!!!!!!
554542:04/02/16 10:58
さっそくやってみました。気になるのは
win2k sp4 の internat.exe なのですが
ふたつエラーが出ます。アイコン見ると
APPHELP.DLL が Missing
MPR.DLL が warning です。
warning の詳しい内容はわかりません。
これって普通のことですか?
555542:04/02/16 11:13
検索してみると
APPHELP.DLL は存在しませんですた。で

mpr.dll
size=55056byte
CRC16=592C
CRC32=DA09F811
MD5=28d727048fd45b14f32fc2f3434bac24

て出たんですけどこれはこれでOKでしょうか?
556デフォルトの名無しさん:04/02/16 11:26
C言語をどのくらい理解したらC++に移行したほうがいいのですか?
基礎編を終わらした程度では厳しいでしょうか?
関数が書けたらもういいんじゃないか
558554:04/02/16 12:50
ううう。すみませんがどなたか win2k sp4 な方
Dependency walker で internat.exe をチェックして
結果を教えてくれませんか。具体的には
APPHELP.DLL : missing
MPR.DLL: warning
というエラーが出るかどうか、です。
>>556
malloc/freeを使った動的なリストと、再帰関数くらいは
書けるようになってからがいいと思われ。

MFCで副スレッドからメインスレッドに仕事の進行状況を
メッセージで送っているんですが、WM_TIMERみたいに
メッセージキューに1つだけメッセージが置かれるように
したいんですが、そういうことって簡単にできるでしょうか?

同じメッセージで進行状況を伝えようと思うのですが、
メッセージすべてに反応して欲しいわけじゃないので
同じメッセージがメッセージキューに複数溜まるのを
防止したいのです。何かいい方法ないですか?


561デフォルトの名無しさん:04/02/16 15:54
HDC hdc;
LPTSTR lptStr = TEXT("表示テスト");
hdc = GetDC(hWnd);
TextOut(hdc , 10 , 10 , lptStr , lstrlen(lptStr));
ReleaseDC(hWnd , hdc);

とすると

'hWnd' : 定義されていない識別子です。
'hWnd': 識別子は、引数依存の照合を使用しても見つかりません。

というエラーが出ます
なぜでしょうか?
562デフォルトの名無しさん:04/02/16 15:56
>>561
hWndが見えないから
563デフォルトの名無しさん:04/02/16 15:58
>>562
どうすれば見えるようになるのでしょうか?
564デフォルトの名無しさん:04/02/16 16:01
>>563
どっかでウインドウ作ってるんなら、hWndがあるはずだろ。
それを何とかして、>>561のコードのところから見れるようにしないと。
#include <windows.h>
HWND hWnd;
↑これはどこで宣言してるん?
567デフォルトの名無しさん:04/02/16 16:14
>>558
出るよ
"表示テスト"と表示したいウィンドウのハンドルだよ
569デフォルトの名無しさん:04/02/16 16:20
>>562
>>564
>>565
>>566
winmain.cppのみで宣言してました

@関数の引数にHWND hWndを指定したらできました
あと
A561が書いてある.cppにextern HWND hWnd; を書いてもできました
なぜ@の場合でもできるんですか?


アドバイスありがとうございました
>>560
PeekMessageで特定のメッセージを覗いて見て
無かったら放り込めばいけるかも
>>569
Cからやり直したほうがいいかと…。
572デフォルトの名無しさん:04/02/16 16:38
基礎は大切だよ
>>567
ありがとうございました(・∀・)
574デフォルトの名無しさん:04/02/16 17:31
vc6.0 mfcでd&dによるファイルパスの取得をしたいのですが。
教えてください。
575デフォルトの名無しさん:04/02/16 17:34
576574:04/02/16 17:41
BEGIN_MESSAGE_MAP(CFoo, CDialogなど)
()の中は何を指定すればよいのですか?
>>560
そーゆーのはメインスレッドが定期的にサブスレッドの
状況を見に行けばいいんじゃねぇか?
>>570
なるほど。PeekMessageで特定のメッセージの
フィルタリングできるのですね。
参考になりました。

>>577
現在そちらの方針で行っている処理もありまして、
色んなやり方でやってみようと思ったんですが、
たしかにそちらの方が簡単かも知れない。
ただ、SetTimerを使わない場合は、PeekMessageも
使えそうです。
579デフォルトの名無しさん:04/02/16 21:25
文字列の比較にはstrcmp関数を使うと思うんですが、
日本語の文字列を比較したいときはどうすればいいのでしょうか。
全く同じかどうかを比較するならstrcmpでいけると思うんですが、
例えば、3文字目から"あいうえお"と並んでいる場合などを調べるときの方法が分かりません。
初歩的なのかもしれませんが、教えてください。よろしくお願いします。
環境はVC++6.0です。
>>558
日本語や空白を含むパスのファイルだとうまく動かんよ。

ロードしているDLLが見たいのならこれの方が便利でつよ。
http://www.sysinternals.com/ntw2k/freeware/procexp.shtml
>>579
必要部分をユニコードにしては伺か?
wstring か CString のユニコード版を使うと
簡単かと思われ。
>>579
APIに CompareString() があります。
これはひらがな/カタカナの区別なしに整列させたりできます。

>例えば、3文字目から"あいうえお"と並んでいる場合などを調べるときの方法が分かりません。

この例えはよく分かりませんが。
583デフォルトの名無しさん:04/02/17 03:34
if (KeyTbl[VK_LEFT] & 0x80)
{
tile_x--;
x = TILE_WIDTH*(tile_x-1);
}
if (KeyTbl[VK_RIGHT] & 0x80)
{
tile_x++;
x = TILE_WIDTH*(tile_x-1);
}

右と左の矢印キーを同時に押してると上のイフ文の両方を実行するのですか?
どうもそれらしい動きをするので困っています
>>583
期待通りに両方実行されると思いますが?
585デフォルトの名無しさん:04/02/17 04:06
>>584
そうだったんですか…
疑問がやっと解決しました
どうもありがとうございました
586デフォルトの名無しさん:04/02/17 04:14
int a=0;
scanf("%d",&a);
を、キーボードからの入力があるまで止めるためにかいたのですが
なぜか入力待ちの状態がなくそのままプログラムが進行してしまいます
どうしてでしょうか?
>>586
scnaf()なんかを使うから。

はい、次の方。
>>586
scanf はよくわからんが
getchar() でも止まったから、一時停止だけなら
そちらを使ってみては?
589586:04/02/17 08:51
>>587
なぜscanfをつかったらだめなんですか?
>>588
getchar() でもだめでした
入力があるまでプログラムが停止するんですよね?
sprintfで入力状況確認してもなにも入ってないしなんででしょうか?
590デフォルトの名無しさん:04/02/17 08:55
 スクロールバーでつまみを移動させると
再描画が2回行われてしまいます。
一回再描画したら数秒間は再描画しないように
フラグを立ててもだめです。
再描画するとき、つまみの位置を移動させないときは
再描画は1度きりです。
どうすれば再描画を1度きりにできるのでしょうか。
 また、100MBのデータを読み込むとき、メモリを100MB
使用してしまうのですが、どうすれば、メモリを少なくして
データを利用することができるのでしょうか。データを少しづつ
読み込むという方法があると思いますが、それだと、
すごく時間がかかってしまいそうで・・・
591574:04/02/17 09:46
>>574
>>575
foo.hでそのまま宣言したがクラス内で宣言していないと
エラーが生じ、クラス内で宣言すると
オーバーロードされたメンバ関数が '<Unknown>' にありません
といったエラーがでるのですが。
どうか教えてください。
>>589
未取得のキー入力(たぶんリターンだけ)があったんだろう
scanfで、%dだと数字以外は読んでくれないしキーバッファもそのまま

>>590
どういうメッセージが来てどういう反応してるか調べてみて
大きいデータならファイルマッピングがお勧め。用途にもよるが
>>591
いったいどういう書き方をしたんだ?
594574:04/02/17 09:57
>>590
>>591 のエラーはニアミスでした。
しかし、クラス内で宣言していても
'CAboutDlg' クラス内で宣言されていません
とでるのですが。
>>598
scanfの前にfflushで標準入力バッファクリアしとけ
>>594
なんか根本的にVC++(MFC)の使い方を間違ってる気がするんだが・・・
やりたい事と、何をやったかを詳しく書いて見ろ
597574:04/02/17 10:23
>>596
〜略
class CVcreigaiDlg : public CDialog
{
〜略
afx_msg void OnButton7();
afx_msg void OnDoubleclickedButton7();
afx_msg void OnDropFiles(HDROP hDropInfo);
〜略
};
今作成しているソフトにソースを組み込んでみたのですが、
宣言している内、他の関数は使えるがOnDropだけ
宣言されていないとエラーが生じます。
とりあえず、cppの部分はそれだけエラーがでました。
ほかは何も引っかかってはいません。
やりたいことはd&dによるファイルパスの取得です。
よろしくお願いします。
598デフォルトの名無しさん:04/02/17 10:24
>>589
getchar();

俺のコンソールプログラムはこれで止まってるが、おかしいな?

ちゃんと実行されてないんじゃないの?
ブレークポイント設定してデバッグしてみたら?
599590:04/02/17 10:25
> >>590
> どういうメッセージが来てどういう反応してるか調べてみて
> 大きいデータならファイルマッピングがお勧め。用途にもよるが

ありがとうございます。ぜひファイルマッピングについて
勉強をしてみます。
あと、スクロールバーですが、すごくツマミの範囲が大きい(0〜1000000)のとき、
ツマミをマウスで移動させていくと、ある一定の位置で急に0に戻ってしまいます。

デバッグをしてもわかりません。スクロールバーの範囲を変えても特に
変化はありません。一体どうすればいいのでしょうか。
>>599
Winの仕様。
俺は範囲が大きくなったらスクロールの単位も大きくするようにして回避してる。
601574:04/02/17 10:35
>>597
引数間違っていました。
解決です。
お手数掛けました。
>>599
たしか、16bitの頃の数字ひきずっててMFCだと16bitの
数値しか通知してこないいんだと思った。
メッセージハンドラの中でGetScrollInfo() 呼び出せば正しい数値が取れるはず
603デフォルトの名無しさん:04/02/17 11:44

CFileのGetLength() ってDWORD返すけど、これって
最大でも2GB程度しか表せないみたいなんだけど、
これを超えるサイズのファイルの場合はどうなるんでしょう?
今って4GB程度のファイルはあるんじゃないですっけ?
DWORD で4GBでは。
って、VC++7のヘルプ見て見たらCFile::GetLength() はULONGLONG を返してた・・・
605デフォルトの名無しさん:04/02/17 12:20
>>604
signed だと2GBになりません?
計算違いかも知れないけど。

VC++7だと拡張されてるみたいですね。
うちはVC++6なので。7に乗り換え必要なのかな。
DWORD は 4バイトですよね。
ULONGLONG は 8バイトでいいんかな?
typedef unsigned long DWORD;では
APIは最初から対応してますけどね。NTFSがあったから当然だけど
Seekをカレントからにして扱う数値が32bit超えないようにすれば
現行のものでも使えますし。

DWORDは unsigned でしたか。
失礼しますた。

Seek を使って、GetLength をオーバーライドできそうだけど
うちはFAT32だからうまく試せるかな。

608デフォルトの名無しさん:04/02/17 17:57
他人の書いたソースの修正を、VC++でやってます。
VC++触るのはこれが初めて。

ツールバーを1個増やすため、ツールバーを形成しているBMPを探し、
編集してコンパイルしたら、24bit環境のツールバーが真っ黒になりました。

なんでだろうと思ったら、
オリジナルのBMPが40KBなのに、編集して数を増やしたのに33KB。
Windowsペイントで開いて上書き保存しただけでは同サイズ40KBなのに、
キャンパスを広げて保存すると30KBに。

同じ非圧縮24bit BMPに種類があるんでしょうか・・・。
>>608
非圧縮BMPには基本的には種類は無いが比率的に32bitBMPなんてことは、、
VC++のバージョンは何?
610デフォルトの名無しさん:04/02/17 18:49
>>609
あ、32bitか。
手持ちのグラフィックツールが対応してないから、
そのプロパティで24bitと出てただけだけ。
素直に、エクスプローラのファイルプロパティで見たら32bitでした。

32bit BMP保存できる道具、探さなきゃ・・・
ありがとうございました。
611デフォルトの名無しさん:04/02/17 18:50
オイ、初心者ども。↓を実践しろ。

ロリータ指向プログラミング
http://www.entis.jp/doc/lolita_programing/lolita1.html
612デフォルトの名無しさん:04/02/17 19:09

VC++6.0のリソースエディタで16色以上のBMPやアイコンを
編集することはできるんですか?

613デフォルトの名無しさん:04/02/17 19:14
べつに、なんでもVCのものを使う必要も無いだろうに。
6は無理だな。7はできる
256色なら6でもできる。
616デフォルトの名無しさん:04/02/17 19:47

VC7 ってのは VC++.NET 2003 のことなんですか?

VS.NET 2003 academic を買おうと思ってるんですが、
商用利用の制限はあるんでしょうか?
通常のProfessional が10万でacademic が2万くらい
なんですが、価格差がめちゃ大きいのでなんか
機能制限があると思うんですが、どういった違いがあるんでしょう?
お前、アカデミックの意味が全然わかってないな。
どこの学生だ?
頼むからプログラマにはならないでくれよな。
618586:04/02/17 20:14
>>595
fflushで標準入力バッファクリアしてもだめでした
>>598
コンソールではなくてアプリケーションプログラム上に書いてます
ブレイクポイントを設定しても代入されてなくて
入力待ちにはならず素通りしてるようです
%dヤメロ
620586:04/02/17 21:13
>>619
char a;
scanf("%c",&a);
にしてもだめでした
入力待ちにすらならずにそのままプログラムが進行してしまいます
コンソールプログラムのときはちゃんとできるんですけど
ウィンドウズプログラムのときは使えないのかな…
>>620
諦めるなッ
622586:04/02/17 21:30
>>621
励ましの言葉ありがとうございます
もう少し考えてみます
623デフォルトの名無しさん:04/02/17 21:35
>>618
ウインドウズプログラムのときは無理じゃないの?
右上のボタンで終了するのに、なんで
scanf で一時停止する必要があるの?
>>620
Winかよ!
スタートアップがWinMain で標準入力があるかよ
625586:04/02/17 21:52
>>623
directXのフルスクリーンモードでやってるのでブレイクポイントとか設定してもうまくいかないし
ctrl+alt+deleteで切り替えるの面倒なんで
プログラムの怪しい挙動するところで一時停止させながら変化を見たいんです

ウィンドウアプリでは無理だったんですか
画面に文字表示するときもコンソールとはちがってデバイスコンテキストが必要になったみたいに
入力も複雑になってるんでしょうか?
626586:04/02/17 21:55
>>624
そうですWinです
Winではできないんですか…
ほかの方法探してみます
なんかネタとも釣りともつかないレスで進行中のスレは
ここですか?

AllocConsole(); シレ、とか言ったら紙だろうか。
リモートデバッグするのが一番いいんじゃなかろうか。
例外処理 (初回) は test.exe にあります: 0xC00000FD: Stack Overflow。

というエラーがでたのですが考えられる要因としては
どのようなことがあるでしょうか・・・?
ボタンを押したらなるのですがブレークポイントをボタンのところに設置しても
とまってくれないのです・・・。
スタックオーバーフローって書いてあるじゃん
無限再帰か巨大なスタック変数を取ったか
631629:04/02/18 10:05
ありがとうございます。
ブレークポイント以前には何もないのですが、
ブレークポイント以降に60000個を配列に入れる動作があります。
そこが原因の場合、ブレークポイントでとまらずにStack Overflowするのですか?
ソース見てないしなんともいえないけど
60000個の配列をスタックに取ってるの?
型分からないからなんともいえないけど
それでも6万ってのは多いな
633629:04/02/18 10:48
>>632
ありがとうございます。
int型の配列でとってます。
というか、スタック溢れさせたら動かないから。
静的な配列はスタックを消費されるので、あんまりでっかいのは動的配列かなんかにした方が良い。
一時凌ぎ的な考えなら、プロジェクトの設定でスタックサイズ(「スタックアロケーション」)決められるから
そこを適当に大きな数字入れとく。デフォルトが1MB
>>633
関数の入口でスタック上の領域は確保されるから、
その配列にアクセスしなくてもその後に確保される変数や
関数呼び出しなんかでオーバーフローするよ。

いい機会だから動的確保の仕方覚えた方がいいんじゃね?
あんましよくないけど、対処療法的な解決方法としては
関数から追い出してファイルスコープのグローバル変数にでもすることだ。
637629:04/02/18 11:57
ひとまず動的確保について調べてみようと思います。
その後、>>636についてやってみます。

ありがとうございました。またよろしくお願いします。
638デフォルトの名無しさん:04/02/18 13:25
ファイルから一行読み込んで、
その行が正しいフォーマットかどうかのチェックで、
WinXP Pro(日)では意図した動きをするのに、
Win2000Server(英)で同じモジュールを実行させた時、
チェックに引っかからないはずの行がチェックに引っかかってしまい、
チェックに引っかかるはずの行がチェックを抜けてしまいます。
どうしてこんなことになるんでしょうか?
2000には存在しないAPIを使っている。
>>639
( ´ー`).。oO(それだとランタイムエラーにならないか?)
narannyo
mushi sarerudake
新しいほうに無いならエントリだけ置けるけど
古いほうに無いのはエラーになる可能性高いっしょ
>>638
デバッグしてからこい。
アタリをつけるとすると、ランタイムの挙動の違いとなると環境によって変わることがあるな。
ロケールとか。少なくとも、デフォルトは違ってそうだ。英語版w2kserverなんて入れるんのもめんどいんで調べないけど。
644638:04/02/18 14:43
なるほど。
うっかりしてました。>>639
出直してきます。。。>>643
645デフォルトの名無しさん:04/02/19 09:40

Path Function なんかで使う、MAX_PATHが
260で定義されているんですが、これって
短すぎないですか? たしか、パスって
1024バイトまで許容されていたと思うのですが。

そのまま使って大丈夫なのかな?
VC++6.0 + Win2K です。
>>645
ファイルシステムによるんじゃないか
647デフォルトの名無しさん:04/02/19 09:52
みんな使ってるからいいや、なんちゃって^^;
http://www.google.co.jp/search?q=MAX_PATH&hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&start=0&sa=N
648646:04/02/19 09:52
パスよりもファイル名そのものの制限がきつそう
649デフォルトの名無しさん:04/02/19 10:07
>>646
ファイルシステムっつーのは、FATとかNTFSとか?
Windows環境に限って言えばフルパスで
1024じゃなかったっけ? 少なくとも256というのは
ちっと短すぎじゃない? 大丈夫なのかな?
650デフォルトの名無しさん:04/02/19 10:09
>>647
http://risky-safety.org/~zinnia/doc/maxpath.html

これはなかなか興味深いですね。
>>649
確かWin95だと256じゃなかったか?98もそうだった気がするが・・・
652デフォルトの名無しさん:04/02/19 10:37
256ってそんなに短いか?
フロッピーディスクだとどうよ?
654デフォルトの名無しさん:04/02/19 11:32
>>651
ども。そうみたいですね。
エクスプローラで試してみました。

ルートに254文字のファイルを作成することができました。

ウインドウスタイルを駆使して、タイトルバーの右側に表示
されるボタンを「最小化ボタンのみ」にしたいのですが、
どなたか教えてください。

(最大化ボタンと終了ボタンは無効化ではなく表示自体を消したい)
よろしくお願いします。
656デフォルトの名無しさん:04/02/19 17:13
研究室の仕事で、測定装置が吐き出したテキストを読み込んで、座標変換を
してファイルに出力するプログラムを書こうと思っています。
仕様は、1行目に「X Y Z data」とかいうタイトル行みたいなのがあって、
2行目から数字データが並んでます。
問題なのは、データとデータの間が半角スペースで埋まっていることと、
(テキストエディタで見たとき各列が揃うようにスペースが入ってる、
 測定装置屋が見栄えよくするためにやったと思われ)
データファイルのサイズがバカでかいということです。
(データ行数が>300k行、ファイルサイズ>10MB)
ド初心者なので勉強しながらやってますが、とりあえずwhileとgetlineで
読み込みのテストしようとしたところ、大方の予想通りdjになりました。
こーゆー巨大なデータを扱おうと思ったときはどうすればいいのでしょうか?
657デフォルトの名無しさん:04/02/19 17:20
>>656
どういうエラーが出るの?
getline は STLかな?

658デフォルトの名無しさん:04/02/19 17:22
>>656
エラーも何も(応答なし)→タスクマネージャーのお世話に・・・
気が短いのか
660デフォルトの名無しさん:04/02/19 17:27
データベースにファイルのパスを格納するときには、フィールド長は260文字でいいのかな。
教えてエロい人。
661デフォルトの名無しさん:04/02/19 17:29

俺は CFile 使ってるけど、数百メガのファイルを
読み込んでも別にエラーは起きてないけれど。
デバッグで1つ1つ動作を追って、どうして
暴走するのか確認してみては?

現状ではほんとにgetlineでエラーになっているのかどうかも
分からないし。
662デフォルトの名無しさん:04/02/19 17:35
>>661
ネットで転がってたテキスト(おそらくどこかの大学の講義用資料と思われ)
みて作ってたので、CFile知らなかったです。
そのテキスト見てやってたんですが、ifstreamとか使ってるのが問題なのかな…?
VC初心者ならMFC使った方が簡単で無難じゃないかと思う
>>655
WM_NCPAINT のハンドラを作ったらどうか
665デフォルトの名無しさん:04/02/19 17:57
>>662
とりあえずどこで永久ループしてるのか
デバッグしてみるのが吉。
実行するときに時々タイトルバーに[停止]って出るのはなに?
これって何か駄目なことが起こってる?
667664:04/02/19 18:19
>>655
つーか、たしかsysmenuの項目を抜くとボタンも消えると思った
>>667
pSysMenu->DeleteMenu(SC_MAXIMIZE,MF_BYCOMMAND);
だと無効化になるが消えない
>>655
無理だろ。
クローズボックス単体の指定がウインドウスタイルにない。
独立して指定できるのは最大化と最小化だけ。
システムメニューを消せば全部消えるし。
>>645
それってPath関連のAPIで使える長さの制限ってことだろう
UNCを使えば32k文字まで可能になる。
671デフォルトの名無しさん:04/02/20 00:19
あの、ウインドウのハンドルを取得するのってどうするんでしょうか?
ウインドウは1つしかなくて、

while (1) { //メインループ
  if (PeekMessage(&msg,NULL,0,0,PM_NOREMOVE)) {
    if (!GetMessage (&msg,NULL,0,0))
      break;
    TranslateMessage(&msg);
    DispatchMessage(&msg);
  }else{
    Loop();
  }
}

で、Loop()から呼び出す関数の中で、
LRESULT CALLBACK WinProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
↑このhWndと同じウインドウハンドルの値が欲しいです。

一応調べてみたんですが、GetParentとかGetWindowとか、いまいちよく分かりません・・・。
CreateWindowで作った時にHWNDを返してくれてるじゃん。
673671:04/02/20 00:26
>>672えーと、最初はそれをグローバル変数に入れてたんですが、
なんかグローバル変数がたくさんすぎて、管理ができなくなってきたので
減らそうと思って・・・素直にグローバルにした方がいいですかね・・・
674671:04/02/20 00:33
あっ、今気づきました。Loop関数にハンドルを渡せばいいんですね。
ウインドウ作成を関数化してたから気付かなかった・・・
お騒がせしまつたスマソ。
675デフォルトの名無しさん:04/02/20 01:37
質問でございます。

A →→→→→→→
           ↓
←←←←←←←←

→→→→→→→→


Aをこの様に動かすにはどうすればいいでしょうか?
なお、Aの座標は(0、0)とし、右端を(7,7)します。
端までくるとY軸に1つ下がります。
ようは、インベーダーの動きです。
自分なりに考えてプログラムを組んでみたのですが
合ってると思うのにちゃんとY軸に下がってくれません。
どうぞ、もし、よろしければお教え願います。

while(1)
{

int X , Y;

if (X <=7)
{
X += 1;
}

if (X == 7)
{
Y -= 1;
}
}
677676:04/02/20 01:45
あ、書き忘れましたが、Aの座標は(X,Y)という変数に格納します。
う〜ん。難しい。
678デフォルトの名無しさん:04/02/20 01:58
__declspec(align(16))というものがあるのですがVC++6.0でコンパイルすると拡張なんたらが無効ですとか
怒られます。SPを当ててないからでしょうか???
>>676 実に興味深い。
・Yから1引くのか?
・Xが1→7まで1足していったら、次は7→1まで1引いていかなあかんて
if (X == ((1 - Y % 2) * 7)) Y++;
else X += 1 - (Y % 2) * 2;
y%2 ? x==0 ? y++ : x-- : x==7 ? y++ : x++;
>>679しかも終わらないw
if(y%2==0) ++x; else --x;
if(x==0 || x==7) ++y;
ナナメに動くのはありなの?
685676:04/02/20 03:26
皆様ありがとうございます。
かなり参考になります!

感謝!ほんと感謝!
686676:04/02/20 03:58
実際は、

float teki_x = -16.0; //敵キャラのX座標初期位置
float teki_y = 10.0; //敵キャラのY座標初期位置

while(1)
{

kiai = (int)teki_y%2;

if(teki_x <=18.0 && kiai == 0 ) //X座標が右隅まで かつ kiaiが0ならば以下の処理
{
teki_x += 0.1;
if(teki_x == 18.0) //右隅まできたらY軸に1.0つ下がる
teki_y -= 1.0;
}
if(teki_x <=18.0 && kiai == 1 ) //X座標が左隅まで かつ kiaiが1ならば以下の処理
{
teki_x -= 0.1;
if(teki_x == -16.0) //左隅まできたらY軸に1.0下がる
teki_y -= 1.0;
}

if(teki_y == 0.0) break;
}


色々な方法を試しましたが、なぜかX軸には動いてもY軸には動かない。。
ピクリともしません。このプログラムだめなんですかね・・
完璧だと思うのに。。
687676:04/02/20 04:00
あ、変数 kiai はint型で本文では宣言してあります。
y下がってる?

突っ込みどころ満載だが、とりあえず、
> kiai = (int)teki_y%2;
yを float ではなく、int にしたらどうか
>>678
7からじゃないかな?
アラインメントの指定なので #pragma で代用するか取っちゃっていいのでは
690676:04/02/20 04:16
>>688
あ、これはフロート型じゃないとダメポなんです。
ドットネットでコンパイルしてるのですが
エラーは起きないです。表示もされて動きもします。
ただ、Y軸にすんともくんとも動かないのです。

teki_y++;

とかやると動くのですが、中身のif文がおかしいのでしょうか。。
691676:04/02/20 04:22
今日の18時までに提出だと言うのに。。。
かれこれ、この動きで2日寝ずに悩んでる。

プログラマーとしての才能が無いのは元より
理解力著しく欠けてるんだろうなぁ
周りの奴らは、この動きは30分で出来たのに。
私だけ、もうかれこれPCの前で30時間以上考え込んでる。。
あははぁ。もうダメポ・・・orz
if(teki_x >= 18.0) //右隅まできたらY軸に1.0つ下がる
こうしてみたら?よくわかんないけど。
693676:04/02/20 04:36
皆様、スレ汚しごめんなさい。・゚・(ノД`)・゚・
こんな低レベルな質問でスレの進行を妨げるのは良くないですね。。
もうプログラマになるのは諦めます。。
ありがとございました。(VΛV)カンシャ

って文を書いて、退学届けの準備をしてたら・・・
>>692さん!動いた!下に動いたょ! \煤i゜∀゜)/ヤッタョ
うわーいうわーい!!

おめでたう。今、ちょこと調べてみたら
if((int)teki_x == 18.0)
でもいいのかな?
評価するときには型を揃えた方がよろしかも。
>>688タンの言わんとしてるのもそれだね。
だからfloatは使うなとあれほど言ったのに……
696676:04/02/20 04:56
よーし!あと13時間。がんばるぞー!
本当にありがとございます。
floatはすっごく嫌な型だって分かった!
== を >= この一文字の差が30時間って重いね。。

ぁ、このスレの方は命の恩人です。。
ほんと、うれしいです・゚・(ノД`)・゚・
 
アド乗せて置いたので、インベーダー完成したら送りますよ〜\(*´∀`)/
欲しい人はメッセ登録よろ〜♪

他スレより誘導されてきました。マルチポストご容赦ください。
複数のモードレスダイアログボックスにWM_PAINTなどのメッセージを送ろうと
考えています。今、親となるCWndにポインタ配列をメンバ関数として持たせ、
ここに登録したCDialogへのポインタに一つずつメッセージを送っていますが、
いまいち美しい方法とはいえないと思います。
SendMessageToDescendantsを使えばすべての子孫ウインドウに対してメッセージを
送ることができるようなことが書いてあったのでやってみましたが、いまいち
うまくいきません。何かよい方法はないでしょうか?
ふつーに前者で良いようなきがするが…。
699デフォルトの名無しさん:04/02/20 07:29
いままで6.0を使っていて
.netの方にも手を出してみたんですが
クラスウィザードってなくなったんですか?
OnDestroyとか編集したい時どすればいいんですか
700デフォルトの名無しさん:04/02/20 08:23
>>697
SendMessageToDescendantsでもできそうな気はするんだけど
WM_PAINTを送るなら pSubWnd->InvalidateRect(NULL) を
やらないと駄目なので、結局ポインタが必要になるのでは?
701デフォルトの名無しさん:04/02/20 09:57
.netに変えてからCScrollBarのHScrollイベントができなくなりました。
なぜでしょうか?
ユーザーに開くファイルを選ばせてそのファイルに対して処理する。
という風にするにはどうしたらいいんですか?
703デフォルトの名無しさん:04/02/20 10:27
どうも.NETと略されるのには違和感があるな。
704デフォルトの名無しさん:04/02/20 10:31
>>702
CFileDialog?
m_Birth(edit)にyyyy/mm/ddの形で日付を入力すると誕生日を計算してm_Age(edit)に
出力したのですがCTimeSpenで年での出力がわからなかったので下記の用な方法でAge
を計算しました。
この方法だと356で割っているだけなので閏年が無視されてやはり問題があると思うのですが
閏年を計算してくれる良い手はないでしょうか?

if(m_Birth.GetLength() == 10){

time_t myTime;
time(&myTime);
CTime tm_Now(myTime);
CTime tm_Birth;
CTimeSpan ans;
int y, m, d;

y = atoi(m_Birth.Left(4)); //年を習得
m = atoi(m_Birth.Mid(5, 2)); //月を習得
d = atoi(m_Birth.Right(2)); //日を習得

tm_Birth = CTime(y, m, d, 0, 0, 0);

ans = tm_Now - tm_Birth;

m_Age = ans.Format("%D");

m_Age.Format("%d", ((atoi(m_Age)) / 365));
}
>>699
ここまで変わると覚えるの大変だよな
やりたい事が操作より先にわかってしまうだけに..
2002 -> 2003 もえらいかわっとるし

メッセージハンドラはクラスビューでプロパティ出してメッセージボタン
ひさしぶりに操作でヘルプ読むようになったよ。
>>705
普通に計算するのはダメ?
int u=(y%4==0 && y%100!=0 || y%400==0);
みなさんはWindowsアプリを作る際にwindowsx.hのマクロって使っていますか?
いまWINAPIの基礎を勉強しているんですがマクロを使わずにやったほうがいいのか
マクロを使ったほうがいいのか悩んでいます。
使わないほうが勉強になるとは思うんですが、マクロのほうが感覚的に覚えやすいのは確かです。
マクロに頼ると他の環境(VC以外)で困る、ということはあるんでしょうか?
709デフォルトの名無しさん:04/02/20 15:12

windowsx.h って何?

なんかMFCで見たことのあるような関数が並んでたが。
なつかしいな、windowsx.h
まだあったのかよこれ
711708:04/02/20 15:30
>>709,710
ってことは使わないほうがよさそうですね、、、。
>>711
俺はAPIじゃなくて、MFCだから参考にならんと思うよ。
windows.h なら使ったことあるんだが、どう違うんだろ?
713デフォルトの名無しさん:04/02/20 15:37
>>711
HANDLE_MSGは使ってるけど。
>>711
マクロ集だしあんまり気にすることもない
いざとなれば自分で定義できるし。
しかしもう生でAPI使ってるほうが少数派なのかもしれんなあ
715708:04/02/20 15:49
windows.hはWINAPIの関数を記述したもの
windowsx.hはWINAPIで使うマクロを記述したもの

だと思ってたんですが。
結局、使う使わないは個人の好き嫌いみたいですね。
とりあえず使わずに記述してやってることをしっかり理解することにしてみます。
ありがとうございました。
AdvancedWindowsくらいしか使ってる書籍みたことないな
717705:04/02/20 17:59
閏年を考慮したものはVC++には無くやはり計算で出すしかないのでしょうか?
考えろ!
考えるんだ!
他の奴に出来てお前に出来ないはずはない!
>676
遅レスだがfloat(浮動小数点)は、
値によって誤差が発生するので == は基本的に使ったら駄目。
>676
#include "stdio.h"

void main()
{
  float n = 0.0;
  int i;

  for( i = 0; i < 10; i++ )
    n += 0.1;

  if( n == 1.0 )
    printf ( "sum:1.0\n" );
  else
    printf ( "not 1.0\nsum:%f\n", n );
}


こんなかんじかな?
がんばれ。
#include <stdio.h>

int main (void)
{

printf ("(′・ω・)<ショボーン\n");
return 0;
}
コマンドまたはファイル名がただしくないとでるんでつがどうしたら?
>>721
もまいが実行ファイルを作ったディレクトリに
移動してから実行シレ。
>698 >700殿
早速のお答え、ありがとうございます。そうですか、やはりポインタ配列は
持っていないといけないのですね。現在のまま進めていこうとおもいます。

どうもありがとうございました。
724デフォルトの名無しさん:04/02/20 22:14

Winアプリからコンソールアプリを起動して、
その出力をWinアプリで取り込むには
どうしたらいいのでしょう?

VC++はコンパイル結果を
IDEの方で取り込んでますよね?
STARTUPINFOをみれば分かるだろう
>>724
やったことないからしらんけど、

::ReadFile( ::GetStdHandle( STD_INPUT_HANDLE ),
      (const char *)buf, strlen( buf ), &dwWritten, NULL );

とかでいけたりするんかも?
知らんけど。知らんけど。
727デフォルトの名無しさん:04/02/20 22:29
ファイルの削除(ゴミ箱に入れる)をしたいのですが、::remove(filename);
ですともちろんゴミ箱に入るはずなどなくいきなり消えてしまい困ってます。
ゴミ箱に入れる方法を教えてくださいませ。
SHFileOperation
>>715

> とりあえず使わずに記述してやってることをしっかり理解することにしてみます。

これは違うだろ。
どちらも同じAPIで、形態が関数かマクロかの違いに過ぎない。
ってゆーか普段関数のつもりで使ってるAPIのほとんどはマクロだろ。
今までマクロだったものが次のバージョンでは関数として提供されることもある。
逆は互換性の面から言ってまず無いけどさ。
関数を使えば「やってることをしっかり理解」だとか思ってたら大間違い。

むしろ何のためにマクロを定義するのかを考えれば使えるところではマクロを使う方が望ましい。

# しかし Long-Horn でごっそり入れ替わることがわかってる WinAPI をいまさら勉強するのってむなしいな・・・。
>>728
ありがとうございます。
>724
CreatePipe() DuplicateHandle()

ちなみに猫のはDuplicateHandle()の使い方が間違ってるから。
732デフォルトの名無しさん:04/02/20 23:11
現在ネトゲを作ってるのですが、常に鯖を起動することは出来ないので
HP上の奥底にテキストデータを用意して、そこにホストはIPを保存、
クライアントはIPを読み込むということをしたいのですが、
HP上のテキストを読み書きするにはどうすればいいのでしょうか?
>>732
そこらに転がってるクラスを使うか自作するか
734デフォルトの名無しさん:04/02/21 03:14
よくアプリケーションでネット回線を使って最新バージョンの情報を取得するものがよくありますが、それはどうやるのですか?
ネットに繋いで、最新バージョンがあるか調べて
通知するなり自動パッチを当てるなりしてるだけですが?
736デフォルトの名無しさん:04/02/21 04:09
>>735
どのようなAPIを使用して最新バージョンがあるか調べるのでしょうか?
Winsock APIを使ってHTTPなりFTP、もしくは独自プロトコルなりを使って
サーバーに問い合わせてるだけ
738デフォルトの名無しさん:04/02/21 04:37
>>737
ありがとうございました
739デフォルトの名無しさん:04/02/21 05:17
次から次へとバグが出てくるので正直疲れました、さようなら…
>>739
サヨウナラ…。

でも目の前にあるバグだけは直してから逝け。
そうすれば見える世界も変わるかもしれない。
>>740
新たなバグの世界が開けるかもしれんぞ
742デフォルトの名無しさん:04/02/21 10:15

.NET2003だと

void unco()
{
for(int i=0;i<4;i++) cout << "hoge";
for(int i=0;i<10;i++) cout << "hage";
}

このコードのコンパイルできるようになりましたか?
>>742
なってるよ
iなんてどこでも使うんだから

int i;

void unco()
{
for(i=0;i<4;i++) cout << "hoge";
for(i=0;i<10;i++) cout << "hage";
}

にすればいいよ。俺って天才!
>>743
サンクス。
そろそろVC6から移る時期かなー。

>>744
forループ内の関数で i使ってたら誤動作起こすべ。
>>744
void foo(vector<int> & a, vector<double>& b)
{
for (vector<int>::iterator it = a.begin(); it != a.end(); ++it) {
cout << * it;
}
for (vector<double>::iterator it = b.begin(); it != b.end(); ++it) {
cout << * it;
}
}
>>742
C++ だと、そんな事が出来るのか。。。
i のスコープが、ウァァァァァァン
>>747
今までのVSはint iの多重宣言だ、と怒られた
749デフォルトの名無しさん:04/02/21 12:24
VC++のリソースエディタを使ってるんですが、ダイアログを作るときに、
コントロールを配置するためにツールバーが表示されなくなりました。
さんざん設定をいじってみたのですが、一向に表示されません。
解決する方法をご存じの方は教えてください。お願いします。
環境はVC++6です。
>>749
ツール > カスタマイズ > ツールバー
じゃなかったかな。
違うかも知れんけど。
>>749
コントロールのやつなら、
やはり>>750のツールバータブで
「コントロール」をチェックすると表示されますた。
752デフォルトの名無しさん:04/02/21 12:34
>>750
表示されました。本当にありがとうございました。
>>745
デフォルトでは多重宣言になるよ。
しかし、この拡張機能だけをOFFにすることができる。
ほかにも、特定の警告をOFFに出来たりする。
便利。

つか、可能ならさっさと乗り換えた方がいいと思うが。

>>747
Cでも最新ならできるんじゃないのか?
>>753
>Cでも最新ならできるんじゃないのか?

ブロックの先頭以外の変数定義って駄目じゃ無かった?
755753:04/02/21 13:39
>>754
C99で参照前なら先頭でなくても良くなった。
今手元に規格書無くて正確なソースが示せないが。

ま、Cスレネタだな。
VCなら.cでも以前から通るだろ?
>>753
多重宣言ってコンパイルエラーってこと?
stroustrupも認めている書き方なのに
デフォルトで使えないとはねぇ。

乗り換えたいけど金が厳しいのも事実。
VS,NET Pro 10万円は高いよー。
>>755
( ・∀・)つ〃∩ ヘェ〜ヘェ〜

>VCなら.cでも以前から通るだろ?

通らない。
758753:04/02/21 14:30
>>756
そう。
VC6だとMS拡張をOFFすれば、規格通りになったんだっけ?
まー、自社の旧Verとの互換性の方が大事だからデフォルトで拡張が有効なのは当然といえば当然。

ループを抜けた後でカウンタを参照するのに便利だからってことらしいんだけど、
ブロック先頭でしか宣言できなかったCからの流れだとそれが自然に出来てたから、その流れなのかも。

>>757
( ・∀・)つ〃∩ ヘェ〜ヘェ〜
.cでも//コメントとか使えるのにな。
>>758
> .cでも//コメントとか使えるのにな。

// 形式のコメントは使えても、ソースの意味が変わらない (例外あるか ?) からいいけど、for(int i 〜) はプログラムの意味が変わってしまうことがあるからな。

static int i;

static void foo()
{
 for(int i = 0; i < 10; i++){ 〜 }
if(i == 0){ 〜 }
}

常にコンパイルエラーになるなら、被害は少ないんだが...。
760貧乏紙:04/02/21 17:43
VC++でDDXだっけ?ダイアログの値を持ってくるやつ。
UpdateData(true);
UpdateData(false);
のやつで、グローバル変数のint配列に入れてSerialize(CArchive& ar)で読みたいのですが
ダイアログのボタン押して配列にセットまではできたのですが、Serialize(CArchive& ar)から
みると値が入っていないんですよ。
僕の考えではMFCのオブジェクト(○○Appクラスの唯一のオブジェクト)ができた時点の値しか
みえてない。つまり、グローバル変数をプログラム実行中に変えたとしても
Serialize(CArchive& ar)の中では変わってない。と考えてます。どうでしょう。
ちなみのダイアログベースのプログラムに仮想関数の実装でSerialize(CArchive& ar)
を実装してます。
>>666おながい。
これが出た後、1回終了して、
もう1度実行しようとすると、エラーが出て出来ないんですよ。
なぜ?
762761:04/02/21 18:22
ちなみにVisual C++6.0で、ブレークポイントなんぞ入れてないし、
スケルトンプログラムを実行するだけで、ほんとーうに時々だけど出るのでエス。
>>761
VCじゃなくて、自作アプリケーションのタイトルバーに
[停止]って出るの? スケルトンでも?
764761:04/02/21 18:49
>>763
あ、VCの方です。
いつもは「プロジェクト名 Microsoft Visual C++ [実行]」って
出てるところです。それの[実行]が[停止]になるとです。
スケルトンすらおかしいのかしらん。
デバッガから起動しておいて止まると何が問題なのか?
>>764
ビルド > 実行
で実行してる?

「デバッグの開始」で実行してないよね?
767761:04/02/21 21:00
え?最近はじめたばかりなんでよー分からんのですが、
F7押したあとF5押してまつ。これだめ?
たまによくわからんけど混合モードとかで停止する事はあるね。
まあ気にしないで、またF5押せば先進むしw
>>767
F7 -> ビルド
F5 -> デバックの開始
ですね。

通常は「実行」で「停止」はなんらかの原因で
デバッグ中のアプリケーションの実行が停止
した状態です。

どういう原因で停止したか、までは分かりませんが。

デバッグ無しの実行の場合は
ビルド > 実行
もしくは ctrl + F5 です。


>>767
普段はデバッグ実行でいいんじゃないかと。
止まったらコールスタック表示してどの関数で止まったか確認すれば?
バグが発生してプログラムが思うように進まなくなると
彼女とHして現実逃避してます
全然進みません
どうしたらいいのでしょうか?
現実逃避に使われる彼女が可哀想なので別れてください
773761:04/02/22 10:14
あー、なんでなんだろう、もう1回スケルトン書き直してみようかなぁ。
それでも出るようだったら、気にしないようにします。
みなさんテンキュ!
エディットボックスの中で正しく改行をする方法を教えて下さい。
ダイアログの中にエディットボックスを作り、次のようにして初期の文字列を
設定していますが、改行コードが文字化けして上手く改行してくれません。

CEdit m_ctrlEdit;
m_ctrlEdit.SetWindowText( "\nTest\nTest\nTest");

リソースエディタでエディットボックスのプロパティもいじり、
「スタイル」タブにおいて、「改行を許可」と「複数行」にもチェックを入れて
あります。
誰かわかる方はいませんでしょうか?
\r\nで。
776774:04/02/22 12:04
>>775
ありがとうございます。解決です!
777デフォルトの名無しさん:04/02/22 13:46

VC.NET2003のMSDNの日本語化の具合はどんなですか?
VC6は、英語ドキュメントが多すぎて
辟易してるんですが。
>>777
日本語化されている部分とされていない部分があります。
>>777
進んでるところも有るが、全体としてはあんまり変わらない気がするな。

C/C++言語規約部分が英語のままなのはちょっとショック。
フィルタを日本語ドキュメントで検索してたら出てこなくて慌てた。
>>778-779
ありがとうございます。
有料でもいいから完全日本語版が欲しいです。
>>780
全文訳業者に発注したら?
金が出せるなら引き受けてくれるだろ
782デフォルトの名無しさん:04/02/22 17:06
メニューに新しい項目を作ってそのハンドラを作ったのですが何故かハンドラが呼ばれなかったので
調べて見るとResource.hで自分が宣言したIDに割り当てられている数字が小さいのが原因でした。
× #define ID_TEST_PROGRESS 0
○ #define ID_TEST_PROGRESS 131

・ID(コマンド?)に割り当てられる数値の範囲が決まってると推測したのですが
 そのへんのいいドキュメントはありませんか?
・メニューを作るときにID名を決める、Resource.hを編集するという2stepを踏んでるのですが
 正しくはどうやってメニューエディタでIDを割り当てればいいのでしょう?

VC.NETを使っています。
よろしくお願いします。
>>782
VCではResource.hを自分の手で編集するというようなことはほとんどしないよ。
それを自動でやってもらうためのVCなんだし。

リソースのプロパティやなんかでIDを設定すれば適当な値が設定されるはずだが。
>>781
1万までは出すけど、それ以上は出せない。
ハァ?
そんなんじゃVC++.NET Stdすらも買えないじゃねーかよ
786782:04/02/22 17:52
>>783
わたしもそう思ってたし、そうできてた気がするんですが
なんで0が設定されるんだろう・・・_| ̄|○
>>782
ウインドウメッセージなら WM_USER + ???? で指定するんだけど、
メニューコマンドも制限あったかな?

>>785
翻訳に1万ってことだって。
文脈で分かりそうなものだが・・・。
>>788
一万程度でできるならさ
MSがやってVCに標準で付けると思わない?

文脈以前の常識の話
>>786
リソースID設定するときに、=0つけちゃったんじゃないの?
IDの話ついでに
VC7には「シンボルブラウザ」というやつがないのかな?
見当たらないんだが
>>789
そういうもんかな。
俺はまたMSが嫌がらせでやってるのかといぶかしんでるが。(w

一人1万でもユーザー1万人くらいはいるだろ?
そうすると1億程度の収入にはなるはずだが。

MSDNの日本語化パッチを
シェアウェアにしていいですか?
>>793
著作権の問題がありそう。
例えば
C:\WINDOWS\デスクトップ\application.exe
とパスを入力するとapplication.exeが起動するようにするには
どうしたら良いでしょうか?
796デフォルトの名無しさん:04/02/22 21:32
VC++でダイアログにコンボボックスを配置してプログラムを組みました。
コンボボックスのアイテムはSendMessageを使って追加するようにしました。
いざ実行してみたのですが、コンボボックスの右の▼のところをクリックしても
下にリストは出てきません。
どういう風にすれば、リストを表示できるのか教えてください。
環境はVisual C++6.0です。お願いします。
>>795
クリエイトプロセスAPIかウインエグゼックAPI
>>796 ちゃんとリストに追加されているかデバッグして確認しなさい
799796:04/02/22 21:42
>>798
追加はちゃんとされてます。
上下ボタンを押すことでアイテムを選べますので。
800デフォルトの名無しさん:04/02/22 21:49
>>796
ドロップダウンリストかな?
リソースエディタを使ってるなら、エディタで
コンボボックスの右側の▼を押すと、ドロップ
ダウンしたときのサイズが表示されるので、
このサイズを拡張すればいいはず。
>>800
あのインターフェースよくないよ。
と言うか、ディフォルトで適当なサイズが表示されるようになっていれば、こういう質問も減ると思うのだが。
802796:04/02/22 21:52
>>800
できました。
コントロール自体のサイズを大きくしなければならなかったんですね…。
VBから移行したのでそんな概念全くありませんでした。
ありがとうございました。
803デフォルトの名無しさん:04/02/22 21:57
>>801
それは同意。
初め、俺もかなり悩んだ。
ダイアログエディタ上でコンボボックスの高さは変えられないんですか?
フォントに依存?
>>804
普通に変えられるだろ?

フォントの差異によってサイズに影響が出るのはどのコントロールもおなじ
806795:04/02/22 22:38
パスにc:\\windows\デスクトップ\test.txtを入力すると
C:\Windows\デスクトップ\Vc++\Filerun\main.cpp(31) : warning C4129:
          'テ' : エスケープ シーケンスとして正しく認識されませんでした。
と出るんですがこれはどういう意味でしょうか?
\が1つ足りん
>>806
Cの基礎
「エスケープ文字」について調べてみよう
809795:04/02/22 22:43
>>807
出来ました。ありがとうございます
>>797
すいません。お礼を言うのを忘れてました。
ありがとうございます。
810795:04/02/22 23:11
CreateProcess(NULL,"notepad.exe c:\\windows\\デスクトップ\\test.txt",NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
こう記述するとc:\\windows\\デスクトップ\\上のtest.txtがnotepad.exeで起動するわけですが
普通の実行ファイルだった場合(例えばsleipnir.exe等)はどうすればよいですか?
>>810
ん? そこまで分かってってなんでワカランの?

CreateProcess(NULL,"sleipnir.exe",NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
フルパスで指定汁
>>810
起動するだけならこちらの方が分かりやすいだろう

CString AppStr = _T("C:\\Program Files\\Internet Explorer\\iexplore.exe"); //パス
CString OptionStr = _T(""); //起動オプション文字列
ShellExecute(m_hWnd, _T("open"), AppStr, OptionStr, NULL, SW_SHOW);

ShellExecuteは実行ファイルパス以外なら関連づけを元に設定されている
実行ファイルでそのファイルを開く。URL(http://)ならブラウザとか。
便乗質問すいません。
_T って無いとまずいんですか
_Tはウニコード以外だとプリプロセッサにあぼーんされる。
Shift_JISだとイラン
816795:04/02/22 23:31
>>813
すいません。MFCはあまり使い方等が分からないもので…。
>>812
フルパスってことは
CreateProcess(NULL,"c:\\windows/デスクトップ/sleipnir.exe",NULL,NULL,FALSE,0,NULL,NULL,&si,&pi)
と指定しろってことですか?実行しても無反応だったのですが・・・
釣り?
>>816
CreateProcessの戻り値くらい見ろよー。

"c:\\windows\\デスクトップ\\sleipnir.exe"
819795:04/02/22 23:41
>>818
はぁ〜出来ました。お騒がせしました。
すいません最後に…ショートカットはどうすれば良いでしょうか?
"c:\\windows\\デスクトップ\\sleipnir.lnk"では無理ですた
>>819
ShellExecute だと動くんでねーのか?
やったことは無いけど。
>>814
_Tマクロは文字コードの互換性をもたせるために付けておくもの
コンパイルされたときに適切なコードの方にしてくれる
もし将来ユニコードでコンパイルし直す必要が出たとしても
コードの書き直しをする必要がなくなる

Tの付く文字列も同じ

TCHAR < CHAR
LPTSTR < LPSTR
だからCreateProcessなんてややこしいもの使わずにShellExecute使えよ
必要ないんだろ?
824795:04/02/22 23:48
>>820、822、823
アドバイスありがとうございました。
本当にお世話になりました。
825795:04/02/22 23:48
822→821ですた
>>795 のコードだと CreateProcess がメモリーリークしていそうな予感。
>>822
_Tマクロを律儀に使ってるヤシって居るのか?
うにこーど 使うことないしなー どんなときに使うのよ
プロのPGで_Tマクロを使わない奴は、明らかに低レベルPGだろ。
んなぁこたぁない。
そもそも_Tを使う場面のほうが限られすぎてるな
>>828
そういうキミこそ使うべき。そう思っていて適当にやっていると、ある時既存のコードを
ユニコードでコンパイルし直す必要が出て困ることになる。プロジェクト自体は使わない
としても、部分コードを使い回すこともあるだろうし、全体にきれいなコードを書くクセ
をつけておいた方がベターだと思うよ。

別にそれがあったからって問題になるわけじゃなし、文字列に_T付けるだけなんだから
クセにして統一しておく。
>ある時既存のコードをユニコードでコンパイルし直す必要が出て困ることになる

そんなこと絶対にない。
むしろVCやWindowsの中途半端なunicode対応による弊害の方がずっと大きくなる。
unicode対応が必要なら専用の処理をきっちり書き上げるべき。
〜W関数を使うかどうか程度の差しかないんだから。
「絶対にない」 と言い切ってるところがすごいな…
将来が見えるのか…

> 〜W関数を使うかどうか程度の差しかないんだから
UNICODE, _UNICODE 定義すれば、
勝手に 〜A 〜W を変えてくれるんだけどなぁ…


ライブラリなんかは、将来どうなるかわからんのだから
特に _T( ) で囲っておいたほうが良いだろうな。
そもそも_T()しておいてコンパイルターゲット変えただけのアプリに意味があるとは思えないけど
実際どうなんだろう
>>835
意味があるから使ってんだよ
最近は95/98系非サポートでもいいのが増えてきたから
UNICODEビルドを多用してるな。
838デフォルトの名無しさん:04/02/23 10:14

Unicode <-> Shift-JIS の変換APIってあるんだっけ?
内部でUnicodeで処理しても、出力はShift-JISにしたい
ってことはわりとあると思うんだが。

>>838
あるか?
あるよ
841840:04/02/23 11:11
あるっつったのはAPIの方ね
WideCharToMultiByte() と MultiByteToWideChar()
842デフォルトの名無しさん:04/02/23 12:36
main関数とclassの宣言・定義を別のファイルに分けて書きたいととき、
ヘッダファイルの中身&各ファイルのプリプロセッサ制御文はどうすればいいのでしょう?
誰か教えて
>>842
好きにすればいいと思うけど
844デフォルトの名無しさん:04/02/23 13:57
vbとvcの違いを教えてくれ
>>844

vcってなんですか?
>>844
文字コード
847デフォルトの名無しさん:04/02/23 15:04
現在ニューヨーク在住で、
IT関連で職を探しています。
面接の時、マイクロソフトの
純粋なプログラミングでアプリケーション
作ったことありますか? と、聞かれ…
はい、MFCを使ってと答えたら怒られました。
どういうことですか?
848デフォルトの名無しさん:04/02/23 15:09
int データを char に変換して出力したいのですが、どう書いたらいいでしょうか?
「API直書きでWindowsアプリを書いたことがあるか」
という意味だったと思われ。
int i;
(char)i;
>>847
その質問はした香具師もよく分かってなさそうだな
やめて正解では?
852通行人A:04/02/23 16:02
>>847,849
pure=混ざりもの無し=ライブラリ無し=WIN32API only ってことですかな。
ふーむ。
MFCも純粋なMS製ライブラリだけどな。
「MSの純粋なプログラミング」なんて初めて聞く表現だ。
>>847
つっこんで欲しかったんじゃないの?





・・・んなこたーない
855デフォルトの名無しさん:04/02/23 16:48
>>854
そうだと思うよ。
顧客からの要求で不明瞭な表現があった場合、確認できるかどうか

を問う面接だった可能性も無いことも無いけど
そうなるともうこのスレというか板の範疇では無いね。
857デフォルトの名無しさん:04/02/23 17:19
VC++ .NET 2003について教えてください。
例えば、FormのWndProcをオーバーライドする場合、Form1.hとかに
直接void WndProc… とか書かないといけないのでしょうか?
デザイナとかから簡単にはできないのでしょうか?

あと、VC++6でいうところのClassWizardみたいなのはないのでしょうか?
メッセージのやりとりとかすごく不便…

858デフォルトの名無しさん:04/02/23 17:35
カーソルの状態変化をリアルタイムに取得→描画するソースを
作ったのですが同じカーソル画像(Arrow)しか描画できませんでした
VC++.NETのSDKです

hCurNow = GetCursor();
bRet = GetIconInfo(hCurNow, &iconInfo);
//略 ここで座標をちょこちょこいじった
if (iconinfo.hbmMask) DeleteObject(iconinfo.hbmMask);
if (iconinfo.hbmColor) DeleteObject(iconinfo.hbmColor);

DrawIcon(hdcMem, x, y, hCurNow);

上記ロジックをぐるぐる回して描画してるのですが、
「I」な表示とか「+」な表示が出てこないのです

どなたかヒントを授けてくださいませんかm(_ _)m
>>836-837
意味があるって、だったらUNICODEビルドだけでよくない?
まったく同じで使用APIが変わるだけのアプリにどんな意味が?
Unicode対応については各自AdvancedWindowsでも読んで納得しておけ。
絶対にUnicodeが必要ない奴は使わなくてもいいんだからそう熱くなるな。
861デフォルトの名無しさん:04/02/23 21:03
Debug実行すると
'C:\WINNT\system32\NTDLL.DLL' を読み込みました。必要な DBG ファイルが見つからないか、開けません
という感じの情報がたくさん出てTRACEの出力が見にくいです。
デバッグ情報を見やすくするよい解決方法はないでしょうか?
かなり環境依存の話になってしまいますが、解る方がいたら教えて下さい。
VC5.0においてDLLをデバッグするとき、プロジェクトの設定において
「追加するDLL」に特に指定しなくともシンボル情報を読み込むDLLと読み込まない
DLLがあります。シンボルがなければブレークポイントが設定できないので、ヘルプ
の記述通りにすべてのDLLを明示してシンボルを読み込むようにしてやると、今度は
ブレークポイントが無視されてしまいます。これではまともにデバッグできません。

しかも、解らないのは、デスクトップとノート、二つの機体にVCをインストールして
開発を行っていますが、デスクトップの方は特に明示せずともすべてのDLLのシンボル
情報を読み込み、デバッグ作業に問題はありません。ですが、同じプログラムを
中間ファイルを含めてノートにコピーしてデバッグを行おうとしても、最初に必ず
一度「全てのファイルを開くことはできません」との警告が発生し、他の作業は
問題なく行えるのですが、シンボルは読み込んでくれないのです。リビルドを
何度か繰り返してみてもダメでした。

わかりにくい説明で申し訳ないのですが、どなたか助けてください。
>>861
シンボルファイルをインストールする

詳細はヘルプから「システム デバッグ シンボルのインストール」を参照
>>862
同じディレクトリにpdbファイル置いてもだめなの?
>>857
その辺のほとんどの部分はプロパティウィンドウに
移った模様。プロパティを隅々まで見れ
866861:04/02/23 21:56
>>863
ありがd。
インスコしてみます。
ttp://www.microsoft.com/whdc/ddk/debugging/symbols.mspx
867861:04/02/23 23:09
>>863
インストールしてみましたb
'C:\WINNT\system32\NTDLL.DLL' を読み込みました。シンボルが読み込まれました。
に、変わりました。
これが邪魔でTRACE等のデバッグ情報が見にくいです。
こいつをフィルタして表示しないようにしたいです。
もう少しキーワードプリーズ。
これもかよ・・右クリックでいちいち消しては
869デフォルトの名無しさん:04/02/24 15:24
>>865
ありがとです
そうおもってプロパティウィンドウとクラスビューもチェックしたんだけど
オーバーライドとメッセージのところに何も表示されないのはなんでなんだろう…
ただの1行も表示されたことない
何か表示される/されないの条件があるんでしょうか?

プロパティウィンドウの上にボタンがあって、
プロパティ・オーバーライド・イベント
が切り替えられなかったっけか?
871870:04/02/24 15:29
ゴメン。
アホだ。
それはもう表示できてたのね・・・。
それでも見れないのか・・・。
ちゃんとクラスを(あるいはフォームエディタでフォームを)選択してから表示してる。
872デフォルトの名無しさん:04/02/24 15:56
>>870,871
ありがとです。
書き忘れてたのですがFrameworkを使ってます。
プロパティやイベントはちゃんと追加・変更できます。
クラスビューやオブジェクトブラウザでForm1とかを選択すると
プロパティのところにオーバーライドやメッセージのボタンがでます。
これを押して表示される画面が常に真っ白なのです。
もしかしてFrameworkではオーバーライドとかは手動で追加・削除が
基本でしょうか?(MFCではちゃんと表示されました)
プロファイル、ってデバッグとリリースのどちらで行うべきでしょうか?
インクリメンタルリンク時に、プロファイルが出来ないのは何故でしょうか?
ボタンにビットマップとテキスト両方表示させたいのですが、うまくいきません。
アドバイスお願いします。
>>874
テキストをビットマップでのせたらダメなんか?
>>874
メモリDCにビットマップを展開してその上からDrawTextとかで文字書いて
それをボタン上に表示させる。
今度から >>1 に 「うまくいきません」は放置っていうの付け加えませんか?
878いずみんせんせぇ:04/02/25 01:58
こんばんはぁ。VC.NETで常駐プログラムを作ったのですが
シャットダウン時にアプリケーションを終了するプログレスバーのウィンドウが
表示されてしまいます。シャットダウン時にウィンドウを表示させない方法教えて下さい〜
OSは2000です。
WM_QUERYENDSESSIONとかそんなの
もしかしてWindow作ってないとか?
見えないウィンドウでメッセージ受けられるようにして
WM_QUERYENDSESSION や、WM_ENDSESSION 、WM_QUITなどに
反応すればいいと思う
881いずみんせんせぇ:04/02/25 02:17
880
そぉなんですぅ。
ウィンドウ非表示なんです。
882いずみんせんせぇ:04/02/25 02:19
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{

switch (message)
{
case WM_CREATE:
OnCreate(hWnd, (LPCREATESTRUCT)lParam);
break;
case WM_TIMER:
OnTimer(hWnd, wParam);
break;
case WM_DESTROY:
OnDestroy(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
>>881 表示非表示無関係
うまくいきません
>>884 人生がですか?
カメラからイメージをキャプチャして表示するプログラムを作りたいのですが、
まったくわかりません。
よいサンプルはないでしょうか?
>>886
CCamera camera->Caputer( "富士山" );
CFile file << camera;
>>887
気持ちはわかるが
Caputerってなんだよ
せっかくネタ入れるならスペルくらいチェックしろよ
>>886
DirectX9 SDKのDirectShowのサンプルが一番楽。
>>889
サンプル見ました。
一番簡単そうなのが、PlayCapっいうのなんですが、
コンパイルが通りません。
strmbasd.libが開けないと言われます。
strmbasd.libが開けない問題は解決できたのですが、
エラーが増えました。
外部シンボル何たらは未解決です、といわれます。
どうしたらいいでしょう?
892デフォルトの名無しさん:04/02/25 18:37
他のウィンドウを操作したいので、FindWindow("クラス名", NULL);でハンドルを取得しました。
しかし、目的のプログラムが起動してないときは戻り値がNULLとなると思うんですが、
そこがうまくいきません。
HWND hHandle
hHandle = NULL;
hHandle = FindWindow("#32770", NULL);
if(hHandle == NULL)
DestroyWindow(hWnd); //hWndはプログラム自身です。
else
SetWindowText(hHandle, "jacked!");
break;

こういう風に書いたのですが、どこがおかしいのでしょうか。
知恵を貸してください。
環境はVC6です。お願いします。
893バズー:04/02/25 18:40
Caputerはほんとうにあるんだ!
>>892
#32770がいくつあると思ってんだ
Spy++で観察することをお勧めします
895892:04/02/25 18:46
>>894
なるほど…。常駐ソフトのタイトルがjacked!になってました…。
このようなプログラムのハンドルを取得したいときはどうすればいいのでしょうか。
ウィンドウタイトルは不定なのでFindWindow以外に何か使えばいいのでしょうか?
>>895
ちょっと複雑になるが、普通のWindowを不可視状態で作り
それとやり取りするというのを昔やったことがある。
>>895
具体的に対象は何であるか(不定でない要素が何か)を書くと良いかも
あとは、、不可視のコントロール貼り付けて
#32770の子ウィンドウを順番にEnumWindowsして
貼り付けたコントロールのタイトルを探すとか
899デフォルトの名無しさん:04/02/25 20:48
はじめまして.
CreateWindowで作成したエディットコントロールの文字カーソル(「|」こんな)の位置を取得したいのですが,
どうすればよいのでしょうか? 教えてください.
GetCaretPos()かな、使ったこと無いけど
901899:04/02/25 21:29
ありがとうございます.うまくいきました.
POINT構造体で結果が返ってきますが,X,Y座標はそれぞれフォントの幅と高さで割ることで
列と行が取得できました.
>>901
スクロールやプロポーショナルフォントのときはどうする気だ。
MFCなら
DWORD CEdit::GetSel()
を使うんだが・・・
EM_GETSEL

SendMessage(
(HWND) hWnd, // handle to destination window
EM_GETSEL, // message to send
(WPARAM) wParam, // starting position (LPDWORD)
(LPARAM) lParam // ending position (LPDWORD)
);

MFCじゃないときはコレ使うのかな?
905デフォルトの名無しさん:04/02/25 23:31

いままで VC++6.0使ってて、
ついに VS.NET 2003 を買ったんだけど、
今回のMSDNって英語ドキュメントでまとめられている
部分ないのかな? なんか英語と日本語が混在してて
情報も重複しているみたいで分かりづらいんだけど。

いままでもそうだったと思うが
907デフォルトの名無しさん:04/02/25 23:59
>>906
VC++6.0のときは
プラットフォームSDK

Platform SDK
で完全に分かれていたと思うんだけど。

新しいのは例えば

MSDNライブラリ > グラフィックおよびマルチメディア
 > グラフィックおよびマルチメディア

MSDNライブラリ > グラフィックおよびマルチメディア
 > Graphics and Multimedia (英語)

と深い階層で別れている。しかも「VC++ドキュメント」で
フィルタをかけると、英語の方が消えてしまう。
日本語の方は全部翻訳されていないのだから、
英語ドキュメントも含めてくれないと困るのだが。

>>907
"DevLang" = "C" OR "DevLang" = "C++" OR "Product" = "VC" OR "DocSet" = "PSDK" OR "DocSet" = "NETFramework" OR ("DocSet" = "kbmsdn" AND "ProductVers" = "kbVC700") AND ("Locale"="kbJapanese" OR "Locale" = "kbEnglish")

Visual C++フィルタを変更して、英語も含めたら
英語ドキュメントも表示されるようになりますた。

909デフォルトの名無しさん:04/02/26 06:37
エディットボックスにテキスト入力してそれを
txtで保存したいんですけど、参考になるサイトありませんか?
おねがいします。
あと、ダイアログベースで作っています
アプリケーションウィザードでSDIまたはMDIを選択。
ビューの種類にCEditViewを選択。
OKをクリック。
完成。

ダイアログベース?知らん。
80bit/64bitの演算精度の切り替えってできますか?
あと丸めモードの切り替えはできるのでしょうか?
VC熟練者の方おねがいします.
>>909
GetWindowText
fprintf
913デフォルトの名無しさん:04/02/26 08:36
>>909
GetDlgItemText
でテキストを取得した後
fputsでも使って書き出しとけ
>>911
CPU,コンパイラ次第じゃないの?
あと、それを汲み取ってくれるOS
なんでシラネ
915デフォルトの名無しさん:04/02/26 11:46
>>858です
このマウスポインタの、カーソル変動について
どなたかヒントだけでも下さいませんか(ノT.Tノ
DrawIcon(hdcMem, x, y, hCurNow);

なんでこんなことしてんの?
しかも、カーソルのイメージ削除してるし
>>911
>80bit/64bitの演算精度の切り替え
Microsoft ランタイム ライブラリは数値演算コプロセッサ (またはエミュレータ) の
デフォルトの内部精度を 64 ビットに設定します。プログラムを LIB/FP10.OBJ と
リンクすることでこのデフォルトをオーバーライドし、チップ (またはエミュレータ) の
精度を 80 ビットに戻すことができます。FP10.OBJ は、リンカのコマンドラインで
LIBC.LIB、LIBCMT.LIB、および MSVCRT.LIB より前に指定する必要があります。

>丸めモードの切り替え
_control87 / _controlfp
char文字列をstringへ変換したくて
string str = pChar;
のようにしたところ、charが16文字以上の場合、
失敗してしまうようで困っています。
(VS.net 2002を使っています。)
どのように変換すればよいのでしょうか?
>>918

string str(pChar);
920デフォルトの名無しさん:04/02/26 14:43
すみません、ちょっと教えて下さい。

VC++で簡易データベースソフト、入力した各項目データを
ファイルにセーブしたり出来る、追加修正削除も可能なソフトを
作ろうと思っています。

何処か参考になる様なページ、サンプルソースは有りませんでしょうか?
921918:04/02/26 14:51
>>919
その方法でも16文字以上は無理なんです・・。
こんなことを聞いてよいものか、ちょっと申し訳ないようなことなんですが、
ダイアログのリソース作る時に使う、
ボタンとかエディットボックスなどの基本的なコントロールが入った
ウィンドウが、なにやら知らないうちに消えてしまいました。
どこを見ても表示/非表示設定などが無いっぽいのですが、
どうしたら表示できるかご存知の方がおられましたら教えてください。
visualc++ 6.0を使っています。。よろしくお願いします。
923デフォルトの名無しさん:04/02/26 15:22
>>921
ほんとかよ? 
ちゃんとヌルターミネートしてる?
>>922
ダイアログ編集画面を表示した状態で
ツールバーのあたりを右クリックして
[コントロール]にチェックを入れる。
925922:04/02/26 15:28
すいません、何も無い所で右クリしたら出てきました。
926922:04/02/26 15:33
>>924
入れ違いだったみたいですいません。
ありがとうございました。解決できました。
927918:04/02/26 16:28
>>923
してます。

string st;
char c[17];
for(int i = 0; i <16; i++)
{
c[i] = 'a';
}
c[16] = 0;
st = c;

↑このようなコードでstに値が入らないんです。
include文とかも含めてテストプログラム全体をアップしてみろ

ちなみにstの中身はどうやって確認した?
printf( "%s\n", st );
ってやってないか?

printf( "%s\n", st.c_str() );
だぞ
>>929がクリティカルヒットの予感
931918:04/02/26 19:08
#include <stdio.h>
#include <iostream>
using namespace std;

int main()
{
string st;
int num = 16;
char c[17];
for(int i = 0; i<num; i++)
{
c[i] = 'a';
}
c[num] = 0;
st = c;

return 0 ;
}

です。
確認は、returnの直前にブレークポイントを入れて
自動変数を見ています。
printf( "%s\n", st.c_str() );
で出力してみれ
つーかcが17に固定なのにnumを変更する意味があるのか。
char c[17];の次の行に、
char d[1000];を入れたら動きまつか?
935918:04/02/26 20:11
>>932
あれ、確かにできてますね・・。
デバッガでは、単に文字量の違いから表示が変わっていただけみたいです。

バグを探していて、その原因がstringの代入ミスだと思っていた
のですが、おかげさまでそうではないことが分かりました。
ありがとうございました。
釣りだったんじゃないだろうな・・w
まあ、初心者は結構あのウォッチ画面にはまるんじゃないだろうか。
どうしても出力したくなきゃ、メモリの方で文字列バッファの先頭アドレスぶちんこんで直接見た方が良いんだよ。
MFCでアイコンをプッシュボタンに表示したいのですが、アイコンが縮小?されて表示されてしまいます。
(アイコンファイルをプレビューで見たサイズより小さく表示される)
拡大して表示する方法はあるのでしょうか?
>>938
ビットマップにすると良い
それで初期化でこんな感じにする

m_Bitmap.LoadBitmap(IDB_BITMAP1);
((CButton*)GetDlgItem(IDC_BUTTON1))->SetBitmap(HBITMAP(m_Bitmap));
940デフォルトの名無しさん:04/02/27 03:20
最近VS.NETを入手していじってみたんだけど、フォームのコンポーネントの
外観がかっこわるい。Win3.1から変わってないような感じ。
最近のWinXPとか、MacOSXみたいなカコイーコンポーネント無いですか?
できれば無料で。
WinXP は、かっこえぇのかッ……!?
942デフォルトの名無しさん:04/02/27 03:58
VS.NETがコントロールの外観を決めていると勘違いしているアフォを発見!
943909:04/02/27 07:00
おくれてすいません。
ありがとうございます、今からやってみます
>>940
OSは何をお使いで?
割れとか言う答えをしそう
我、OS選ばず
♂を選ばず。 = 「やらないか?」


_| ̄|○ ォェ…
948貧乏紙:04/02/27 23:49
VC++5スタジオ使ってますが、ヘッダーファイルに変数とか配列をいっぱい
宣言するとコンパイルエラーにはならないが、起動しても瞬間に終了してしまいますが
これは、正規版を買えということでしょうか?
949デフォルトの名無しさん:04/02/27 23:54
VC++5スタジオ???????
( ゚Д゚)ハァ?
>>948
どういうバージョンにしろそういう制限はないよ
>>948
わけわからん。
正規版じゃないとウィルスしか作れません
>>953
それはある意味スゴイ
朝暇だから、携帯からC++勉強できるとこってない?
>>955
そんなサイトがあるのかどうかは知らないが、
....本でも読んでりゃ良いじゃねーか
本で勉強するという感覚のないのが最近ちょっと多いね
958955:04/02/28 08:59
電車だから、今日みたいな休日は空いてるから本でもいいんだけど、
平日は満員で本なんか読めないんだよ。
>>958
PDA使えば?
>>958
そんな満員の状態だと携帯も見れんと思うが?
好きなサイト、コピペして
携帯にメールでも送っとけ
962958:04/02/28 12:41
>>959
何それ。

>>960
C++の本はでかいだろ。

>>961
今度猫のやつをコピーしてみる。
なんとなく >>958 の人物像を想定できる俺はスーパーハカー
>>962
釣り?
一応マジレスしておくと、NotePCと携帯電話の中間程度の大きさと使い勝手の情報端末。
ここでも見れば見当つくだろ。
http://pc3.2ch.net/test/read.cgi/mobile/1077028872/
965958:04/02/28 14:06
>>962
高い。
やっぱPCからメールで送るのが一番良さそうだな。
>>962
>C++の本はでかいだろ。
お前には俺の言わんとすることが理解出来んようだな。
屑だな。
>>955
印刷しとけ
紙1枚ぐらいなら邪魔にならないし紛失しても問題ないだろ
Visual C++って、どこがvisualなんですか?
Windowが
>>968
できあがったものがvisualっぽい
971958:04/02/28 15:39
>>966
お前が屑。

>>967
それだ。
紙なら折ったりできるしな。
なんかすげー頭悪そう
958は莫迦。
そういう性格じゃプログラムなんか止めとけ。
工房か?
>>971
>966は密着状態で携帯電話を使用するなと言いたいわけだ。
そんなことも判らないお前はプログラマにはなれても上流工程には一生近づけないよ。
さて、頭の悪い人はほっといてそろそろ新スレですね
おれのは

  !?

でかいぜよ?
978デフォルトの名無しさん :04/02/29 01:18
case WM_PAINT:
{
HDC hDC;
PAINTSTRUCT ps;
LPCSTR str = "test";
hDC = BeginPaint(hWnd, &ps);
SetTextColor(hDC, RGB( 0, 0, 255));
SetBkMode(hDC, TRANSPARENT);
TextOut(hDC, 100,100, str, lstrlen(str));
EndPaint(hWnd, &ps);
}
return 0L;

↑はウィンドウプロシジャ内のメッセージのケース文なんですが、
この「中カッコ」を外すとコンパイルできないのはなぜですか?
「strの初期化がcaseラベルによって行われませんでした」
というエラーがでて、次のcase文のところで引っかかってるみたいです。。。
>>978
caseラベルの中で変数の宣言はできまへん。
switchをC++で使うときのマンドクサイところ。
本当は出来ないけど中カッコでcase内全部囲っとけばできるってことなんですかね。
謎な仕様ですね。。。

助かりました。ありがとうございます。
>>980
{ } で囲むと、変数の生存範囲が
{ } の中に限られるので、大丈夫なんでしょう。
こういうスタイルが適切かどうかは分からない。
普段はMFC使ってるから。
VC.Net だとこんなコードも通ってしまう分けなんだが。。。

switch (int a = 1)
{
case 1:
  int b = 2;
}
983978:04/02/29 01:58
なるほどそういうことですか。
そういうもんだと覚えとくことにします。
ありがとうございました。
C++ の言語仕様だと変数の書ける所だと殆どの所で変数定義も出来るらしい。
そんな事を厨にやられた日にゃ。(ry
>>983
次のようなコードだと n = 2 のときに
宣言無しで a が使われちゃうから
問題なんでしょう。

switch ( n )
{
case 1:
int a = 0;
cout << a;
case 2:
a++;
cout << a;
}

>>985
error C2360: 'a' の初期化が 'case' ラベルによって行われませんでした。
>978
ちゃんとエラーメッセージを読め。読みとれ。理解しようとしろ。
>「strの初期化がcaseラベルによって行われませんでした」

別のcaseラベルを通ったときでも、そこより下の位置なら、
strを参照することができてしまうが、初期化部分を通らないから初期化できない。

>982
その初期化式の下に一つでもcaseを作れば、直ちにエラーになる。


って、もう書かれたか。
ええぃ埋めついでに書き込んでやる。
switch (foo) {
int bar;
case 0:
{
int bar = foo;
}
break;
default:
bar = foo;
break;
}
/* 実はcで問題ないコード。 */
★初心者にVisual C++を教えるスレ★ Part11
http://pc2.2ch.net/test/read.cgi/tech/1077965179/l50
>変数の書ける所だと殆どの所で変数定義も出来るらしい。
これってC++じゃなくても最新のISO Cでは出来るようになったとか
噂を聞いたんですが、本当ですか?
int i( int j( A ? B : C ), j += 10 );
>>991
そういうことはできてもしないだろ
993デフォルトの名無しさん:04/02/29 17:57
記念カキコ v(^-^=)
埋め立て
>988
switch()の外でbar使いたいんですけど...
>990 Yes.
997
998
999
1000
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。