戻る

・Edit Box に勝手に改行させない方法(99/3/8)

Edit Box はなかなか便利なものなんですが、そのままだと勝手に改行とかされて 使いにくい場合があります。例えばデフォルトの設定では 英語の単語ごとに区切られて改行されてしまいます。 そういう時は EditWordBreakProc() という コールバック関数を使って自分で改行の仕方を指定しましょう。 詳しくは下のソースと MSDN ライブラリの EditWordBreakProc() を 見て下さい。

// ワードブレークプロシージャのテスト
// (c) tokai@fides.dti.ne.jp  3/6/1999

// リソースエディタで IDD_DIALOG というダイアログを作って
// 複数行のテキストボックス IDC_EDIT1 を貼り付けておく

#include < windows.h>
#include < commctrl.h>
#include "resource.h"

LRESULT CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);
int CALLBACK MyEditWordBreakProc(LPTSTR,int,int,int);

//-------------------------------------------------------------------
// メイン
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPreInst,
				   LPSTR lpszCmdLine, int nCmdShow){
	
	DialogBox(hInst,MAKEINTRESOURCE(IDD_DIALOG),NULL,(DLGPROC)DlgProc);
	
	return 0;
}


//-------------------------------------------------------------------
// ダイアログプロシージャ
LRESULT CALLBACK DlgProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
    switch (msg) {
		
	case WM_INITDIALOG: // 初期化
		
		// コモンコントロール初期化
		InitCommonControls();
		
		// ワードブレークプロシージャセット
		SendMessage(GetDlgItem(hWnd,IDC_EDIT1),
			EM_SETWORDBREAKPROC,0,(LPARAM)MyEditWordBreakProc);
		
		break;
		
	case WM_CLOSE: // クローズ
		
		EndDialog(hWnd,IDOK); 
		
		break;
		
	default:
		return FALSE;
    }
	return TRUE;
}


//-----------------------------------------------------
// ワードブレークプロシージャ
// 本当は code  の値によって処理を変えなければいけないが
// 面倒なので割愛。詳しくは MSDN ライブラリの EditWordBreakProc 参照
int CALLBACK MyEditWordBreakProc(LPTSTR lpch,int ichCurrent, int cch,  int code){
	return 0;
}


・テキストファイルの複数行選択の方法(99/4/3)

Mule の場合ならテキストファイルの複数行を選択するには Ctrl+スペースでマークをセットして目的の位置にカーソルを 移動すれば複数行を選択した事になりますが、VC のエディタには マークという概念は無さそうです(いや、ちゃんと調べてませんが)。 そこで複数行を選択するには SelectLine コマンド(デフォルト設定 では Ctrl+F8)で行選択モードを起動して、起動した位置から 選択したい位置まで行ってクリックすれば複数行が選択されます、ってこんな 基本的な事も今まで知らなかったんか > 私 (^^;

#いやどうも Mule のくせが抜けなくてねえ… (^^;

また、GoToMatchBraceExtend コマンド(デフォでは Ctrl+Shift+]) で ある括弧から対応する括弧まで選択範囲を広げる事が出来ます。

それとマークは無いと書きましたが、範囲指定を開始したいところに カーソルを置いて、終了地点でシフトキーを押しながら左クリック しても複数行の範囲指定が出来ます。


・Win95/98 のタイマーは終わっている(99/4/7)

普通、タイマー処理をしようとすると SetTimer() を使うのが常套手段だと思うのですが、 WinNT のはともかく、Win95/98 のタイマーはかなり精度が悪いです。 つーか、終わってます。1 回の呼び出しで平気で 5/1000 秒位狂うのでまともに 使う事は出来ません。

従って Win95/98 で出来るだけ正確なタイマーを使用したいならば、自分で タイマー用のスレッドを作って動かす必要があるでしょう。


・タスクトレイに登録しない方法(99/4/8)

普通にウィンドウを作成するとタスクトレイにそのウィンドウの 名前が表示されてしまいますが、拡張ウィンドウスタイルとして WS_EX_TOOLWINDOW を指定するとタスクトレイに登録されなくなります。 詳しくは CreateWindowEx() のヘルプをみて下さい。


・ロックのかかっているファイルのサイズ取得 (2000/4/18)

ファイルのサイズを取得するときは普通は GetFileSize() を使いますが、 他のアプリケーションがそのファイルを開いていてロックされている場合は GetFileSize() は使えません。その場合は FindFirstFile() を使います。 具体的には次のようにします。

// FindFirstFile() でファイルサイズ取得サンプル
// (c) 2000,tokai@fides.dti.ne.jp

#include<windows.h>
#include<stdio.h>
#include<stdlib.h>

int main(int argc,char* argv[]){

  FILE *f;
  char szFile[] = "test.txt";

  HANDLE hFind;
  WIN32_FIND_DATA findData;

  // 試しにファイルにロックをかけてみる
  if((f=fopen(szFile,"r")) != NULL){
  
    // ファイルサイズ取得
    if((hFind = FindFirstFile(szFile,&findData)) != INVALID_HANDLE_VALUE){
      fprintf(stdout,"%d byte\n",
        findData.nFileSizeHigh*MAXDWORD+findData.nFileSizeLow);
      FindClose(hFind);
    }
    
    fclose(f);
  }
  else fprintf(stderr,"%s が見つかりません\n",szFile);

  return 0;
}