2006-06

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

メッセージボックスについて

MessageBoxは3種類くらいある。
//CWindow::MessageBox & CWnd::MessageBox
int MessageBox( LPCTSTR lpszText, LPCTSTR lpszCaption = NULL, UINT nType = MB_OK );

//Win32API
int MessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType);

//Afx
int AfxMessageBox(LPCTSTR lpszText ,UINT nType =MB_OK,UINT nIDHelp =0); 
int AFXAPIAfxMessageBox(UINT nIDPrompt ,UINT nType =MB_OK,UINT nIDHelp =(UINT)-1); 

使用例↓
//CWindow::MessageBox & CWnd::MessageBox
MessageBox("内容");
MessageBox("内容" , "タイトル" , MB_OK);

//Win32API
MessageBox(NULL , "内容" , "タイトル" , MB_OK); 

 クラスによって上の例は使える時と使えない時がある。
 デバックの時とかに取り合えず、何か表示したい時は次のようにすれば、グローバルのMessageBox(Win32APIのほう)を呼ぶので大体表示できる。最初の”::”が重要。
 後から気づいたんだけどAfxのメッセージボックスならもっと短くいけそう。。
//Win32API
::MessageBox(NULL , "内容" , "タイトル" , MB_OK);

//Afx
AfxMessageBox("内容"); 

 ↓みたいにやっとくと、値を見たいけどデバッガ使うのがメンドイ感じのデバック用に便利かも。
CString text;
text.Format("count = %d" , count);
AfxMessageBox(text); 

スポンサーサイト

#pragmaを使用したライブラリのリンク

 VCでは普通、ライブラリのリンクはメニューのプロジェクト>設定>・・・って感じで設定するけど、この1行をヘッダの頭に入れておけば設定しなくてもリンクされる。DLLのリンクでも同様に使うらしい。
#pragma comment(lib, "xxx.lib")

Windows XP ビジュアルスタイルの使用

 アプリケーションにXPのビジュアルスタイルを使用するための方法を2つ。

①MyApp.exe.manifestを使用する
 ↓のXMLソースをMyApp.exe.manifest(MyApp.exerの部分は作ったアプリケーションの実行ファイル名)って名前で保存して、実行ファイルと同じフォルダに入れておく。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"
<assemblyIdentity
    version="1.0.0.0"
    processorArchitecture="X86"
    name="CompanyName.ProductName.YourApp"
    type="win32"
/>
<description>アプリケーションの説明</description>
<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            processorArchitecture="X86"
            publicKeyToken="6595b64144ccf1df"
            language="*"
        />
    </dependentAssembly>
</dependency>
</assembly> 

②埋め込む
1.↑のソースをMyApp.exe.manifest(こっちは違うファイル名でも大丈夫かも)に保存。
2.ComCtl32.lib にリンクする。
3.XML 形式を含むソース ツリーに MyApp.exe.manifest を追加する。
(プロジェクト > プロジェクトへ追加 > ファイル でMyApp.exe.manifestを追加)
4.アプリケーションのリソース ファイルにマニフェスト(↓)を追加する。
(MyApp.rcをテキスト形式で開いて一番下に追加すればok)
#define CREATEPROCESS_MANIFEST_RESOURCE_ID 1
#define RT_MANIFEST 24
CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST MyApp.exe.manifest

もしくは#defineしないで直接書く。(実はこっちのほうがいいって話も・・・)
1 24 MyApp.exe.manifest 

 ①の方法だといつも実行ファイルと一緒にMyApp.exe.manifestを入れておかないとダメなので配布する時なんかは、イマイチかも。
 ②は一回やるだけで、実行ファイルのみでビジュアルスタイルが適用される。

適用前適用後
ちょっとだけかっこよくなった。

モードレスダイアログボックスを作る

 モードレスダイアログボックスってのは親ウィンドウにも入力可能なダイアログボックス。親に入力できないのはモーダルダイアログボックス。

 モードレスダイアログボックスの作り方の最小限の手順は以下の通り。
1.ダイアログエディタで普通にダイアログを作成し、そのクラスも作成する。
(例としてクラスをCDlg1とする)
2.CDlg1のインスタンスを生成。
3.CDlg1のメンバ関数内でCDialog::Create(CDlg1のダイアログID , (※親ウィンドウオブジェクトのポインタ))を呼ぶ。
(CDlg1::IDDで自分のダイアログID)

 例①:Modelessというメンバ関数を作ってそこで親ウィンドウオブジェクトのポインタを渡している。
//親クラスでインスタンス(モードレスの場合はメンバ変数とかにしないと消えるよ)
CDlg1 Dlg1; 

//親クラスからの呼び出し
Dlg1.Modeless(this); 

//CDlg1クラス内のメンバ関数でCDialog::Create()の呼び出し
void CDlg1::Modeless(CWnd *pParent)
{
    CDialog::Create(CDlg1::IDD , pParent);
}

//消す時はこんな感じ。もう一度作る時はCDialog::Create()を呼べばOK
void CDlg1::OnOK()
{
    DestroyWindow();

例②:コンストラクタ内で作ってしまう場合。また、new、deleteを使ってみる。

//親クラスのメンバ変数にCDlg1クラスのポインタを作っておく
CDlg1 *Dlg1; 

//親クラスでインスタンスの生成
Dlg1 = new CDlg1(this); 

//CDlg1クラス内のコンストラクタ内でCDialog::Create()を呼ぶ。
void CDlg1::CDlg1(CWnd *pParent) : CDialog(CDlg1::IDD , pParent)
{
    //{{AFX_DATA_INIT(CDlg1)
        // メモ - ClassWizard はこの位置にマッピング用のマクロを追加または削除します。
    //}}AFX_DATA_INIT
    
    CDialog::Create(CDlg1::IDD , pParent);

//最後に親クラスでDestroyWindow() と delete とか
Dlg1->DestroyWindow(); 
delete Dlg1; 

 意外と簡単で、ダイアログとかを普通に作ってそのメンバ関数の中でCDialog::Create()を呼ぶだけ。CDialog::Create()をCDlg1のメンバ関数内で呼ぶのは、親クラスで呼ぶとなぜかエラーになる。やってることは一緒だと思うんだけど、よくわからん。

 CDialog::Create()した状態でもう一度CDialog::Create()するとエラーになるけど、DestroyWindow()は、もう一度DestroyWindow()してもエラーにならないので、うまく使えばいいかも。

 ちなみに、親クラスのメンバ変数にCDlg1のインスタンスを持たせておいて、例2のようにCDlg1のコンストラクタ内でCDialog::Create()を行うと、親ウィンドウがない状態になり、もう一つ普通に違うダイアログが出た状態になる。重なりの順位が変えられるのと、タスクバーにアイコンがもう一つ出るところが違う。

色の設定なんかのマクロとか

 MFCというかWin32SDKでは色の設定なんかを行うときにCOLORREF型というものを使う。COLORREF型を使いたいときは、RGBそれぞれの成分値との変換のマクロがあるので大体それを使う。

 COLORREF型:カラー値として使われる 32 ビット値。(DWORD)
//RGBの成分からCOLORREF型へ
COLORREF RGB(BYTE bRed, BYTE bGreen, BYTE bBlue);

//COLORREF型からRGBの成分へ
BYTE GetRValue(COLORREF rgb); //赤
BYTE GetGValue(COLORREF rgb); //緑
BYTE GetBValue(COLORREF rgb); //青 

 ちなみにCOLORREF型はDWORDで4バイトなのでその中身は、最初の1バイトが常に0(使わない)、それからB成分、G成分、R成分の順となる。
 COLORREF型どうしを足したり引いたりして計算できる。その時は各成分0~255じゃないとおかしくなるので注意。クラスでもないので範囲制限してくれたりしない。

プリントスクリーンのやり方

GetDesktopWindow()でデスクトップウィンドウをゲットして、更にそのデバイスコンテキストをゲットする。んで、これを描きたいDCにコピるだけ。
CRect rect;
GetDesktopWindow()->GetWindowRect(rect); //デスクトップのサイズ
CDC *wdc = GetDesktopWindow()->GetWindowDC(); //デスクトップのDC
dcMem.BitBlt(00, rect.Width(), rect.Height(), wdc, 00, SRCCOPY);

自分のウィンドウを写したくないときとかは、直前に最小化とかするなり適当に対処すればいいんじゃない?

二次元配列の動的な割り当て方

int table[3][4] みたいな二次元配列を動的に割り当てる方法を調べたら以下の方なやり方を見つけた。(BorlandのQ&A)
int x = 4;
int y = 3;
int **table = (int **)malloc(sizeof(int *) * y);
for(i = 0; i < y; i++){
    table[i] = (int *)malloc(sizeof(int) * x);
}

 しかし、この方法を使うと table[0][3] と table[1][0] の間が連続ではなくなってしまい、
for(j = 0; j < y; j++){
    for(i = 0; i < x; i++){
        table[j][i] = i + (j*x);
        printf("%d\n", *((*table) + i + (j*x)));
    }
}

のようにした場合に、p[j][i]に値は入るのですが、*((*p) + i + (j*4))では同じ位置を指してくれません。ってことになる。

 そこで、次のようにすると連続でちゃんと使えるようになる。
int **table = (int **)malloc(sizeof(int *) * y); 
int *tableY = (int *)malloc(sizeof(int) * x * y); 
for (i = 0; i < y; i++) table[i] = tableY + i * x; 

/* 処理 */

free(*table);
free(table);

 せっかくだからこれを関数化して使いたいと思ったけど、C言語のみだと型ごとに作らないとダメっぽい。
しょうがないのでC++で作ると次のようになる。テンプレート使って結構すっきり。
//2次元配列を動的に取る
template <typename MYTYPE> MYTYPE **new2(size_t y, size_t x) 
{
    MYTYPE **p = new MYTYPE *[y]; 
    MYTYPE *pY = new MYTYPE[x * y]; 
    for(int i = 0; i < y; i++) p[i] = pY + i * x; 
    return p;
}

//2次元配列を開放
template <typename MYTYPE> void delete2(MYTYPE **pp)
{
    delete[] *pp;
    delete[] pp;
}

int main()
{
    int **p1 = new2<int>(34);//int p1[3][4]を動的に取る

    /* 処理 */

    delete2(p1);//p1開放


    double **p2 = new2<double>(59);//double p2[5][9]を動的に取る

    /* 処理 */

    delete2(p2);//p2開放


    return 0;

 注意することは**new2(size_t y, size_t x)なので、**p1 = new2(3, 4)としたときにはp1[3][4]の配列を確保したことになる。new2(y, x)のときp[y][x]。これは外側(x側)が先に回るためこうした。引数と配列の縦横の関係を間違えないように!

 もしかしたらC++だともっと楽に出来る一般的な方法があるのかもしれないけどこんな感じで・・・

ActionScript(FLASH)のいろいろ

・ムービークリップを見えなくする
my_mc._visible = false //非表示
my_mc._visible = true //表示


・当たり判定(重なってるかどうか)
my_mc.hitTest(x, y, true//(x, y)に重なってるかどうか


・一定時間ごとに繰り返し実行
onClipEvent(enterFrame){/*処理*///ムービークリップのフレームレートごとに繰り返す

もしくは
var intervalID:Number = setInterval(my_func, sec, hoge); //sec秒ごとにmy_func(hoge)を繰り返す
function my_func(hoge){/*処理*/


・マルチ言語に対応する(文字化け対策)
System.useCodepage = true//UTF-8で文字化けしない


・ムービークリップの音量変更
this.createEmptyMovieClip("my_mc"this.getNextHighestDepth());
my_mc.attachAudio(netStream);
var audio_sound:Sound = new Sound(my_mc); //音声用に新しくmcを作っておいてそこに音だけ接続
audio_sound.setVolume(vol); //volで調節


・外部テキストファイルを読み込む
myLoadVars = new LoadVars();
myLoadVars.onLoad = function(bSuccess){}; //成功とか失敗とかしたら呼ばれる
myLoadVars.load("data.txt"); //data.txtの中身を読み込む
//data.txtの中身は『変数名 = 値』の形にしといて、読み込むと読み込んだムービークリップで『this.変数名』っていう変数ができて中身が『値』になってる


・外部ファイル(サーバーにあるやつ)に書き込む
Flash単体では無理
perlやPHPのCGIに送ってそいつで書き込んでもらう

formData.sendAndLoad("./cgi-bin/test.cgi", recvData, "post"); 
//formDataに送るデータを入れて、recvDataに帰ってくるデータが入る。帰って来るデータは通常ブラウザに表示されるHTML部分なので注意


FLVPでflvファイルが見れない場合の注意

※普段Internet Explorer以外のブラウザを使用している方へ※

このソフトはMacromedia Flash Player 8を使っていますが、Internet Explorerでインストールしてあることが条件となっています。

Internet Explorer以外のOpera、FireFox、Netscapeなどを使っている方は、IEでもインストールしてみてください。
IEコンポーネントを使ったブラウザはIEと同じなので大丈夫です。
よく分かんない人はIEで↓に行けばインストールされてなければされるし、されてればされてるって出ます。
Macromedia Flash Player 8

この他にもバグ等はたくさんあると思いますが、お気軽にご連絡ください。
なるべく直します。


FLVP v1.22 (フリーソフト)
Vector
説明

«  | HOME |  »

プロフィール

ku_470

Author:ku_470
HP

FLVP (FLVプレイヤー)
Vector
説明

カテゴリー

最近の記事

最近のコメント

最近のトラックバック

FC2カウンター

リンク

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。