■MFC相談室 mfc11.dll■
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNG前スレ
■ VisualC++(MFC限定)相談室 MFC10.dll■
http://pc5.2ch.net/test/read.cgi/tech/1074104008/
関連リンクは >>2-10 の辺り。
0064デフォルトの名無しさん
NGNG今AppWizard見てみたのだが、リソースに使用する
言語ってコンボがあるが、それには日本語、英語しか
ないからOSもVCもハングル版買わないといかんのでは?
0065デフォルトの名無しさん
NGNGMessageBox(NULL, a, L"韓国語", MB_OK);
少なくともこういうのは通るし動くんで、
・ソースはUTF-8とかでハングルで直接書く
・プリプロセッサとして、UTF-8なソースをShift_JISなソースに書き換える
(リテラルのユニバーサルキャラクタへの置き換え)物を作る
でなんとかなるんじゃ。リソースはどうにもなんないかもだけど。
006659
NGNGそこには「韓国語」っていうのもあるんですが、
コード生成時に何やらエラーが出て止まります。
やはり環境が揃ってないと無理なんでしょうかね・・・
レスくれた方、どうもありがとです。
もうちっとVC++で粘ってみます。
と、リロードしてみたら!
>>65
これは、素晴しい!
なんとかなりそうです。感激!
0067デフォルトの名無しさん
NGNGMSDNの「Unires サンプル : Unicode リソース ファイルの使用」
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vcsample/html/vcconuniressampledemonstratesuseofunicoderesourcefiles.asp
は?
006859
NGNGサンクス!
国際化対応のサンプルがいろいろ参考になりました!
一度リソースファイルを外部エディタでUnicode保存すると、
VC.NETのリソースエディタから編集がきかなくなる事が分かりました。
(VC.NETのリソースエディタがUnicode未対応の為)
#define KOREAN_1 L"\uD55C\uAD6D\uC5B4" //韓国語
#define JAPANEASE_1 L"\u65E5\u672C\u8A9E" //日本語
#define ENGLISH_1 "ENGLISH"
CString ss;
ss = KOREAN_1;
の様に使う事で、多言語対応する事ができました。
0069デフォルトの名無しさん
NGNGどなたか教えてください。
//App.cpp
#include <afxwin.h>
#include "App.h"
CMainWin::CMainWin()
{
Create(NULL, "sample");
}
afx_msg void CMainWin::OnPaint()
{
//CPaintDC dc(this);
}
afx_msg void CMainWin::OnLButtonDown(UINT nFlags, CPoint point)
{
MessageBox("abcde");//ここで停止(応答なし)
}
BEGIN_MESSAGE_MAP(CMainWin, CFrameWnd)
ON_WM_LBUTTONDOWN()
ON_WM_PAINT()
END_MESSAGE_MAP()
BOOL CApp::InitInstance()
{
m_pMainWnd = new CMainWin;
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();
return (TRUE);
}
CApp App;
0070デフォルトの名無しさん
NGNG//App.h
class CMainWin :public CFrameWnd {
public:
CMainWin();
afx_msg void OnPaint();
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
DECLARE_MESSAGE_MAP()
};
class CApp :public CWinApp {
public:
BOOL InitInstance();
};
//EOF
OnPaintメッセージハンドラにCPaintDC dc(this)を記述すると問題なく動作
します。理由がどうしてもわかりません。
007169
NGNG0072デフォルトの名無しさん
NGNG0073デフォルトの名無しさん
NGNGメンバ関数版じゃなければ表示されるんでない?<MessageBox()
AfxMessageBox()だっけ?
0074デフォルトの名無しさん
NGNGファイルの保存でユニコードで保存してやると
ちゃんと保存される。
0075デフォルトの名無しさん
NGNGほんとだね
これはなかなか興味深い
ちょっと調べてみるか
007675
NGNG何時までたってもウインドウが無効領域のままになる
なのでOnPaintの無限ループのような状態が起きている
これのせいで、MessageBoxがメッセージを受け取れないみたいだね
WM_PAINTのディフォルト処理を入れなきゃウインドウズプログラムはだめだってことで
007775
NGNGちゃんと書くと
WM_PAINTメッセージってシステムがこの領域は無効な領域(描画が必要な領域)
だと判断したから発生させるメッセージ(よく再描画するのにInvalidateを呼び出すが
これは、アプリ側で無理やり無効な領域にしているってこと)
このメッセージを受け取ったアプリ側は、適切な描画処理をするもしくは
ウインドウズディフォルトの処理に任せる
このとき使用されるAPIがBeginPaint EndPaint、MFCならCPaintDC
このAPIもしくはクラスを使用した場合、無効領域がクリアされるため
再び無効領域が出来るまでになるまでWM_PAINTが発生されることは無い
69の作ったプログラムでは、WM_PAINTメッセージのハンドラで何も処理をしない為
何時までたってもその領域が無効であるとシステム判断するのでWM_PAINTを繰り返す
WM_PAINTは優先度の高いメッセージなので、この処理が完了しないと他のメッセージは
受け取れない、メッセージボックスはWM_INITDIALOGなど一連のメッセージを受け取って
処理をしない限り動けないので何時までたってもそのメッセージを受け取れない
つまりプログラムが停止しているわけではなく、OnPaintメッセージでループしている
説明下手ですまんが、大体のニュアンスは分かっていただけたかな?
0078デフォルトの名無しさん
NGNG多言語リソースは.rc2の方に書いておけば、リソースエディタは影響受けない。
もちろん、逆にそこの部分はリソースエディタの支援をまったく受けられなく
なるんだけど、C(++)ソース中にユニバーサルキャラクタで書き込むよりは
可読性があっていいんじゃないかと。
ちなみにユニコードで保存したrc2ファイルは、テキストファイルとして
VisualStudioで編集できる。
007969
NGNGWM_PAINTメッセージが送られ続けているということですね。
Windowsプログラムはまだやり始めたばかりでわからないことが多いですが
とても楽しいです。
これからもがんばっていこうと思います。
本当にありがとうございました。
0080デフォルトの名無しさん
NGNG何かいいコントロールとかってありますか?
ピクチャーコントロールって、こういうときに使うのでしょうか?
0081デフォルトの名無しさん
NGNG俺はこういう時に使ってる
0082デフォルトの名無しさん
NGNGダイアログボックスに貼り付けると、IDがIDC_STATICとなって、
普通のスタティックテキストと扱いが同じなんだよね。
で、どうやって使わせようとしているのかの意図が読み取れなくて???
0083デフォルトの名無しさん
NGNG0084デフォルトの名無しさん
NGNG0085デフォルトの名無しさん
NGNGスライドさせてそのアプリケーションの表示をスクロールさせたいのですが、
スクロールバーそのものの位置は更新できるんですけど表示はスクロールしません。
どうやればよいのでしょうか?ちなみに今は
void CXXX::foo()
{
SCROLLINFO si;
si.cbSize = sizeof(SCROLLINFO);
si.fMask = SIF_ALL;
::GetScrollInfo(m_hScroll, SB_CTL, &si);//m_hScrollはスクロールバーのHWND
SCROLLINFO tmpsi = si;
tmpsi.fMask = SIF_POS;
int pos = si.nPos;
while(pos < si.nMax)
{
tmpsi.nPos = pos;
::SetScrollInfo(m_hScroll, SB_CTL, &tmpsi, TRUE);
//キャプチャ処理
pos += si.nPage;
}
}
という感じです。
0086デフォルトの名無しさん
NGNGInvalidateRect()してみるとか?
0087デフォルトの名無しさん
NGNGプロセス間通信はイベントオブジェクト以外苦手じゃ
0088デフォルトの名無しさん
NGNGそれじゃアプリにスクロール要求は出ない。
他アプリをスクロールさせるってのはやったことないけど、
単純にWM_xSCROLLを送ればいいんじゃなかろうか。
0089デフォルトの名無しさん
NGNGMessageBoxがダイアログの中央ではなく、画面の中央に表示されて
しますのですが、ダイアログの中央に出す方法はありませんか?
環境はVC++.NET 2003です。
/* スレッド作成 */
m_Thread = AfxBeginThread(func, (LPVOID)this, THREAD_PRIORITY_NORMAL);
/* スレッド関数 */
static UINT func( LPVOID pParam )
{
CHogeDlg *pHogeDlg;
pHogeDlg = (CHogeDlg*)pParam;
pHogeDlg->Hogehoge();
return 0;
}
/* 実行部分 */
int CHogeDlg::Hogehoge( void )
{
AfxMessageBox("Hoge",(MB_OK | MB_SETFOREGROUND | MB_ICONEXCLAMATION | MB_TASKMODAL),0);
}
0091デフォルトの名無しさん
NGNG普通はどっちなんだっけ?
ともかく、ダイアログ関係を中央に出そうとするのはCenterWindowの仕業だから、
そこにブレークポイントをかけて、しかるのちに対策を考えればいいかと。
0092デフォルトの名無しさん
NGNGそのスレッドでダイアログの情報を持ってないのが原因だろうから、
何らかの方法でCWnd*を渡してメンバ関数版を使えばいいんでないかな。
0093デフォルトの名無しさん
NGNG試していないけど、CHogeDlgがCDialogを継承
しているならのメンバ関数のメッセージボックスを
呼び出せばいいんじゃないの?
0094デフォルトの名無しさん
NGNG>ダイアログの中央に出す方法はありませんか?
方法はある。 WM_INITDIALOG
もっと簡単な方法が知りたいってことか?
どんくらいまでわかるのかを書かないと
それこそ基本中の基本から説明せにゃならん。
もちろん、それは万単位が相場で只ではできない。
0095デフォルトの名無しさん
NGNGMoveWindow()とかSetWindowPos()でサイズを変えようとすると
必ず落ちますが(DEBUGビルド時)、これって許されないのでしょうか。
CChildFrameのサイズに合わせて大きさを変えたいのですけど。
009695
NGNG簡単にいいますと、フォーム内のダイアログテンプレートのサイズを
変更するにはどうしたら良いのか、ということです。
単純にGetDlgItem()ではダメですよね。NULLが返ってきてしまいます。
009789
NGNG回答ありがとうございます。
とりあえずスレッド作成元のCWnd*をグローバル変数に設定して、
スレッド内からMessageBoxを呼び出す方法と、直接メンバ関数の
MessageBoxを呼び出す方法を試しましたが、結果は同様でした。
なお作成元のスレッドでAfxMessageBoxを呼び出した場合には、ダイアログの
中央に表示されます。
>>94
当方組み込み向けのCが本職で、Windowsプログラムはほとんど経験がありません。
スレッド内でメッセージボックスを表示させることはWindowsプログラムではほとんどしな
いことなんでしょうか?
0098デフォルトの名無しさん
NGNG俺もあまり詳しくはないが、そこまでMessageBoxにこだわる必要はないのでは?
メッセージ出力用のダイアログクラスを作成して、そのクラスに親の位置を渡せば良いのでは
ないのかな
ダイアログクラスなら、OnInitDialog()で表示位置やサイズを変更すると簡単なんだけど。
意図していたことと違うかもしれないが、暫定的にしておいて、他のもっと重要なところに
パワーをかけた方が良いと思うよ
0099デフォルトの名無しさん
NGNGスレッドにはメッセージループを持つスレッドと、持たないスレッドがある。
WM_INITDIALOGはメッセージなわけだが・・・
0100デフォルトの名無しさん
NGNGWindowsでは、ウインドウはどれかのスレッドに属している、
つまりスレッドがウインドウを保持しているといっていい。
そして1つのウインドウは複数のスレッドに共有されることは無い。
ウインドウには親子関係があるがこれは同一スレッド内においてのみ有効
スレッドがウインドウを作った場合親ウインドウに別のスレッドのウインドウを
指定しても無効になる
メッセージボックスの場合、内部的にCenterWindowが呼ばれるわけだが、
親ウインドウがいないもしくは無効な為、ど真ん中に表示されてしまう
どうしてもと言うなら、試したこと無いので出来るかどうかわからないが
見えない親ウインドウをスレッド元のウインドウサイズにあわせて作って
おいてメッセージボックスを呼び出すとか
0101デフォルトの名無しさん
NGNGつまり、スクロールバーを表示させたくないってこと?
0102デフォルトの名無しさん
NGNG一応調べてみたらこういうのあったけど
ttp://www.codeproject.com/docview/resizableformview.asp
0103デフォルトの名無しさん
NGNG参考ページでもいいのでお願いします。
0104デフォルトの名無しさん
NGNG別スレだけど
http://pc5.2ch.net/test/read.cgi/tech/1087929711/969
でCの宿題の回答にCStringArray使ってるね
0105デフォルトの名無しさん
NGNGコンパイルすらできない俺って・・・_| ̄|○
VC7ですが、助けてくださらんか?
01061/2
NGNG長くなって申し訳ないが、969さんのコード全部転載させてもらいますた。
あくまで例として載せてくれたみたいなので、宣言が抜けてたりしたのを
追加しただけです。
#include <afxwin.h>
#include <io.h>
#include <iostream>
using namespace std;
CStringArray arDstFileList;
CStringArray arSrcFileList;
void Read(CString& csFile)
{
CStdioFile readFile;;
CString csRead;
readFile.Open(csFile,CFile::modeRead);
CString csDstFile;
CString csSrcFile;
while (readFile.ReadString(csRead)){
csDstFile = csRead.Mid(0,csRead.Find(":"));
csSrcFile = csRead.Mid(csRead.Find(":") + 1,csRead.GetLength());
arDstFileList.Add(csDstFile);
arSrcFileList.Add(csSrcFile);
}
readFile.Close();
}
01072/2
NGNG{
// ファイル有無(書き込み権チェック)
for (int i = 0;i < arSrcFileList.GetSize();i++){
if (0 != _access(arSrcFileList.GetAt(i),6)){
throw new CFileException();
}
}
// ファイルの移動
for (i = 0;i < arSrcFileList.GetSize();i++){
if (0 == ::MoveFile(arSrcFileList.GetAt(i),_T("C:\\temp\\") + arDstFileList.GetAt(i))){
throw new CFileException();
}
}
}
main()
{
try{
Read(CString("C:\\list.dat"));
Move();
}
catch(CException* pE){
pE->Delete();
cerr << _T("ERROR") << endl;
}
}
0108105
NGNGVCを初めて3日目なんで、こういうコードを載せてもらった場合、
どうやってスケルトン?(でしたっけ)を作るかわかりません。
MFCアプリケーションで作ればいいのでしょうか?
0110デフォルトの名無しさん
NGNG上のコードだとMFCとは言ってもMFCの中の
CStringArrayを使うだけで、中身はコンソールプログラム
だから(簡単に書くとコンソールプログラムはmainから
始まり、ウィンドウズプログラムはWinMainから始まる)
とりあえず、Win32コンソールプロジェクトで作成する。
で、CStringArrayを利用するにはMFCをリンクする必要が
あるのでプロジェクトのプロパティで「MFCの使用」を
「共有DLLでMFCを使用する」または「スタティックライブラリ
でMFCを使用する」に設定する。
始めて3日だと、リンクとかDLLとかスタティックとか言われても
わけわからないだろうけど、MSDNにも情報があるのでこつこつ
やってちょ。
0112デフォルトの名無しさん
NGNGダイアログにスタティックウインドウを貼り付けただけのウインドウを作りました
CWinApp::InitInstance中で作成、表示させようとするとウインドウ自体は
表示されるのですがスタティックコントロールのメッセージが表示されません。
メッセージはInitInstanceの関数を抜けたあとなら表示されるので
ただ単純に再描画の為のメッセージを受け取れていないだけだと思うのですが
InitInstance中にメッセージポンプ入れるなど色々試してみましたが思うように
表示されません。
今は、別スレッド化してメッセージの表示は出来ていますが
出来たら単一スレッドで動かしたいです。何かよい方法をご存知の方いらっしゃったら
教えてください
0113デフォルトの名無しさん
NGNG0114デフォルトの名無しさん
NGNGこれはダメかもわからんな
0115デフォルトの名無しさん
NGNGそっかぁ。もっと簡単な例だせばよかたーYO。
ごめん。
MFCの配列クラスはCStringArrayとかCUIntArrayとか
いっぱいあるけど、テンプレートというのを覚えると、
CArray<CString>、CArray<UINT> とCArrayクラステンプレート
だけ覚えると何でも作れるようになるYO。
その場合でもよく使うのは、Add、GetAt、GetSizeとかで
その他のも使ってるうちに覚えてくる。
#include <afxwin.h>
#include <stdio.h>
int main(void)
{
CStringArray ar;
ar.Add("あ");
ar.Add("い");
ar.Add("う");
printf("配列の要素数は %d コです。\n", ar.GetSize());
for (int i = 0; i < ar.GetSize(); ++i) {
printf("配列の %d 番目の 要素は %s です。\n", i, ar.GetAt(i));
}
return 0;
}
0116デフォルトの名無しさん
NGNGまずCString、そのうちCArrayって感じだと思うが。それぞれの
概念が理解できていれば、Arrayの仲間についても自然と分かる
はずだし。
0118デフォルトの名無しさん
NGNG0119デフォルトの名無しさん
NGNGMFCで作っている限りにおいてはvectorを使用するよりも
CStringArrayのほうが利点が多い
0120デフォルトの名無しさん
NGNG0122デフォルトの名無しさん
NGNGCString使うなら、CStringArrayで問題ない。
0124デフォルトの名無しさん
NGNGCStringArrayが良い
アルゴリズム使う場合はstlだけどね
0125デフォルトの名無しさん
NGNG0126デフォルトの名無しさん
NGNG該当するものとはどういう意味ですか?
0127デフォルトの名無しさん
NGNG0128デフォルトの名無しさん
NGNGスレッドからダイアログにメッセージをセットしようとするとアサートします。
スレッドが怪しいのですが、
UINT thread(LPVOID pParam)で作って
CTestdlg;
として、dlg.GetDlgItem(IDC_EDIT1)->SetWindowText(msg);
では駄目なのでしょうか?
どうすればセットできますか?
0129デフォルトの名無しさん
NGNGだったらBoostでいい
0130デフォルトの名無しさん
NGNG俺も使ってるけどねboost
ただ敷居がちと高い
0131112
NGNG0132デフォルトの名無しさん
NGNG0133デフォルトの名無しさん
NGNG便乗で申し訳ありませんが、
1.「共有DLLでMFCを使用する」
2.「スタティックライブラリでMFCを使用する」
1.2はどうちがうのでしょうか?
0134デフォルトの名無しさん
NGNGboostはstl実装じゃないじゃん。
0135デフォルトの名無しさん
NGNG0136デフォルトの名無しさん
NGNGダイアログベースでスレッドをコールするようにしているのですが、
そのクラスへ Cクラス dlg
として、dlg.GetDlgItem(IDC_EDIT1)->SetWindowText(msg)とすると
アサートします。
コンパイルは通るのですが。
0137デフォルトの名無しさん
NGNGワーカスレッドで作ってるから。
0138デフォルトの名無しさん
NGNG他にどんな方法があるのでしょうか?
0140112
NGNG関係が上手くつかめない
0141デフォルトの名無しさん
NGNGユーザーインターフェイススレッド
0142デフォルトの名無しさん
NGNG生成場所はダイアログで実行される関数内です。
CWinThread *p_thread = ::AfxBeginThread(Thread, this);
こんな感じでThread関数を呼び出します。
UNIT Thread(LPVOID pParam)
ワーカスレッドを真似てみたのですが。。怪しいです
0143デフォルトの名無しさん
NGNGダイアログは一つです。クラスも一つです。(スレッドはクラスの宣言をしてません)
>>141
聞いたことはありますが、使ったことはありませんでした。
ちょっと調べてみます。
0144デフォルトの名無しさん
NGNGスレッドに元のダイアログのポインタを引数として渡して
そこからダイアログの子ウインドウに何かやっているってことか
0145デフォルトの名無しさん
NGNG0146デフォルトの名無しさん
NGNGそんな感じでしようとしてましたができませんでした。
0147デフォルトの名無しさん
NGNG0148デフォルトの名無しさん
NGNG「マルチスレッドに対応すること」
と書かれていた場合、どんな風に実装すればいいのでしょうか?
0149デフォルトの名無しさん
NGNG0150デフォルトの名無しさん
NGNG多分そうです。ウィンドウハンドラがNULLです。
0152デフォルトの名無しさん
NGNG同時に同じリソースにアクセスされても整合性が取れる実装ってことだね
ライブラリなんかを作る場合、その部分をしっかり作っておかないと不味い
0153138
NGNGCSubThread *pThread = (CSubThread*)AfxBeginThread(RUNTIME_CLASS(CSubThread),THREAD_PRIORITY_NORMAL, 0, 0);
pThread->m_bAutoDelete=FALSE;
pThread->ResumeThread();
これでCWinThreadの派生クラスを作成しましたが、これでよいのでしょうか?
複数のスレッドにするにはその数分クラスを作成しないといけないのですか?
0154デフォルトの名無しさん
NGNG0156デフォルトの名無しさん
NGNG言っておくけどユーザインターフェーススレッドはそのスレッドでウインドウを
マネージしたい場合(メッセージキューを作って云々ってことね)に
作るスレッドなので138の今回の目的のためには使えないんじゃないかと思う
なぜならユーザスレッドとワーカスレッドなんてのはMFCの上だけで存在するものだし
多分もっと根本的な問題だと思うけど
0157デフォルトの名無しさん
NGNGOnOKの実装ってそのままにしていない?
CDialog::OnOKのディフォルトって内部でEndDialogを呼び出すけど。。。
0158デフォルトの名無しさん
NGNGたぶんソース張ってもらったほうが早いんで、ソース張ってくれます?
スレッドの部分だけでいいんで。
0159デフォルトの名無しさん
NGNGUINT ThreadFunc( LPVOID lpVal )
{
CThreadTEstDlg *pDlg = (CThreadTEstDlg *)lpVal;
pDlg->GetDlgItem( IDC_EDIT1 )->SetWindowText( "テスト" );
return 0;
}
void CThreadTEstDlg::OnOK()
{
// TODO: この位置にその他の検証用のコードを追加してください
CWinThread *pThread = AfxBeginThread( ThreadFunc, this );
//CDialog::OnOK();
}
0161138
NGNGvoid CTestDlg::OnOK()
{
threadflag = 1;
CWinThread *p_thread = ::AfxBeginThread(Thread, this);
//CDialog::OnOK();
}
UNIT thread(LPVOID pParam)
{
CTest dlg;
CString msg;
while(threadflag){
// 処理
//msgにメッセージを格納
}
dlg.GetDlgItem(IDC_EDIT1)->SetWindowText(msg);
}
threadflagがグローバル変数のフラグで
こいつは本当はMutexLockとかしてもう少し複雑に処理してますが、
流れはこんな感じです。
0162デフォルトの名無しさん
NGNG■ このスレッドは過去ログ倉庫に格納されています