・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;
}
Mule の場合ならテキストファイルの複数行を選択するには Ctrl+スペースでマークをセットして目的の位置にカーソルを 移動すれば複数行を選択した事になりますが、VC のエディタには マークという概念は無さそうです(いや、ちゃんと調べてませんが)。 そこで複数行を選択するには SelectLine コマンド(デフォルト設定 では Ctrl+F8)で行選択モードを起動して、起動した位置から 選択したい位置まで行ってクリックすれば複数行が選択されます、ってこんな 基本的な事も今まで知らなかったんか > 私 (^^;
#いやどうも Mule のくせが抜けなくてねえ… (^^;
また、GoToMatchBraceExtend コマンド(デフォでは Ctrl+Shift+]) で ある括弧から対応する括弧まで選択範囲を広げる事が出来ます。
それとマークは無いと書きましたが、範囲指定を開始したいところに カーソルを置いて、終了地点でシフトキーを押しながら左クリック しても複数行の範囲指定が出来ます。
普通、タイマー処理をしようとすると SetTimer() を使うのが常套手段だと思うのですが、 WinNT のはともかく、Win95/98 のタイマーはかなり精度が悪いです。 つーか、終わってます。1 回の呼び出しで平気で 5/1000 秒位狂うのでまともに 使う事は出来ません。
従って Win95/98 で出来るだけ正確なタイマーを使用したいならば、自分で タイマー用のスレッドを作って動かす必要があるでしょう。
普通にウィンドウを作成するとタスクトレイにそのウィンドウの 名前が表示されてしまいますが、拡張ウィンドウスタイルとして WS_EX_TOOLWINDOW を指定するとタスクトレイに登録されなくなります。 詳しくは CreateWindowEx() のヘルプをみて下さい。
ファイルのサイズを取得するときは普通は 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;
}