2004-05-16記。
ここでは、TClock Lightからタスクバー関連などの機能をはずして、時計を改造するだけのTClock SuperLightを作る方法を紹介します。ここではずす機能は次のとおりです。
tclocksuperlight-040512.zip (ソースのみ)
このページで解説してある改造版のソースです。コンパイルのしかたは、TClock Lightのコンパイルを参照。
スタートボタンを改造しているソースは dll/startbtn.c にあります。
dll/main2.c の関数 InitClock から関数 InitStartButton の呼び出しを取ります。
/* InitStartButton(hwnd); // startbtn.c */
関数 EndClock から関数 EndStartButton の呼び出しを取ります。
/* EndStartButton(); // startbtn.c */
関数 OnDestroy から関数 ClearStartButtonResource の呼び出しを取ります。
/* ClearStartButtonResource(); // startbtn.c */
dll/wndproc.cの中で、関数 OnRefreshTaskbar から関数 ResetStartButton の呼び出しを取ります。
/* ResetStartButton(hwnd); // startbtn.c */
関数 OnTimerMain から関数 CheckCursorOnStartButton の呼び出しを取ります。
/* CheckCursorOnStartButton(); // startbtn.c */
関数 OnMouseDown から関数 StartMenuFromClock の呼び出しを取ります。
/* if(StartMenuFromClock(message, wParam, lParam)) // startbtn.c
return 0; */
tcdll.mak で startbtn.obj をリンクしないようにします。
OBJS=dllmain.obj dllmain2.obj dllwndproc.obj draw.obj\
format.obj formattime.obj tooltip.obj userstr.obj\
startbtn.obj startmenu.obj taskbar.obj taskswitch.obj traynotify.obj\
bmp.obj newapi.obj dllutl.obj\
exec.obj utl.obj reg.obj font.obj localeinfo.obj
あとは、startbtn.cを削除してコンパイルすればOKです。tcdll.tclockのサイズが7KBほど減ります。
スタートボタンを改造しているソースは dll/startmenu.c にあります。
dll/main2.c の関数 InitClock から関数 InitStartMenu の呼び出しを取ります。
/* InitStartMenu(hwnd); // startmenu.c */
関数 EndClock から関数 EndStartMenu の呼び出しを取ります。
/* EndStartMenu(); // startmenu.c */
関数 OnDestroy から関数 ClearStartMenuResource の呼び出しを取ります。
/* ClearStartMenuResource(); // startmenu.c */
dll/wndproc.cの中で、スタートメニューをリセットしている部分を取ります。まず、関数宣言から関数 OnRefreshStartMenu を取り、
/* Statics */ static void OnTimerMain(HWND hwnd); static void OnRefreshClock(HWND hwnd); static void OnRefreshTaskbar(HWND hwnd); /* static void OnRefreshStartMenu(HWND hwnd); */
関数 WndProc からメッセージ CLOCKM_REFRESHSTARTMENU の処理を取り、
/* case CLOCKM_REFRESHSTARTMENU: // refresh Start menu
OnRefreshStartMenu(hwnd);
return 0; */
関数 OnRefreshStartMenu を全部取ります。
/* void OnRefreshStartMenu(HWND hwnd)
{
ResetStartMenu(hwnd);
if(!g_bIE4) InitTaskbar(hwnd);
} */
IE 4なしのWindows 95とNT 4でスタートメニューを改造するために、タスクバーをサブクラス化する部分が dll/taskbar.c にありますので、これを全部取ります。まず、関数宣言から CallOldTaskbarWndProc、SubclassTaskbar、UnSubclassTaskbar、WndProcTaskBar の各関数を取ります。
/* Globals */
void RefreshTaskbar(HWND hwndClock);
void InitTaskbar(HWND hwndClock);
void EndTaskbar(HWND hwndClock);
/* LRESULT CallOldTaskbarWndProc(HWND hwnd, UINT message,
WPARAM wParam, LPARAM lParam); */
/* Statics */
/* static void SubclassTaskbar(HWND hwndTaskbar);
static void UnSubclassTaskbar(HWND hwndTaskbar);
static LRESULT CALLBACK WndProcTaskBar(HWND, UINT, WPARAM, LPARAM); */
変数 m_oldWndProcTaskBar を取ります。
/* static WNDPROC m_oldWndProcTaskBar = NULL; */
関数 InitTaskbar から 関数 SubclassTaskbar の呼び出しを取ります。
/* SubclassTaskbar(hwndTaskbar); */
関数 EndTaskbar から 関数 UnSubclassTaskbar の呼び出しを取ります。
/* UnSubclassTaskbar(hwndTaskbar); */
関数 CallOldTaskbarWndProc、SubclassTaskbar、UnSubclassTaskbar、WndProcTaskBar を取ります。
/* LRESULT CallOldTaskbarWndProc(HWND hwnd, UINT message,
WPARAM wParam, LPARAM lParam)
{
(中略)
} */
/* void SubclassTaskbar(HWND hwndTaskbar)
{
(中略)
} */
/* void UnSubclassTaskbar(HWND hwndTaskbar)
{
(中略)
} */
/* LRESULT CALLBACK WndProcTaskBar(HWND hwnd, UINT message,
WPARAM wParam, LPARAM lParam)
{
(中略)
} */
tcdll.mak で startmenu.obj をリンクしないようにします。
OBJS=dllmain.obj dllmain2.obj dllwndproc.obj draw.obj\
format.obj formattime.obj tooltip.obj userstr.obj\
startbtn.obj startmenu.obj taskbar.obj taskswitch.obj traynotify.obj\
bmp.obj newapi.obj dllutl.obj\
exec.obj utl.obj reg.obj font.obj localeinfo.obj
startmenu.c を削除してコンパイルすれば、tcdll.tclockのサイズが5KBほど減ります。
タスクバーの改造機能のうち、「平らなタスクスイッチ」、「区切りを入れる」、「タスクスイッチにアイコンのみ表示」のソースは dll/taskswitch.c にあります。まず taskswitch.c の機能をはずしてみます。
dll/main2.c の関数 InitClock から関数 InitTaskSwitch の呼び出しを取ります。
/* InitTaskSwitch(hwnd); // taskswitch.c */
関数 EndClock から関数 EndTaskSwitch の呼び出しを取ります。
/* EndTaskSwitch(); // taskswitch.c */
dll/wndproc.c の関数 OnRefreshTaskbar から関数 InitTaskSwitch の呼び出しを取ります。
/* InitTaskSwitch(hwnd); // taskswitch.c */
tcdll.mak で taskswitch.obj をリンクしないようにします。
OBJS=dllmain.obj dllmain2.obj dllwndproc.obj draw.obj\
format.obj formattime.obj tooltip.obj userstr.obj\
startbtn.obj startmenu.obj taskbar.obj taskswitch.obj traynotify.obj\
bmp.obj newapi.obj dllutl.obj\
exec.obj utl.obj reg.obj font.obj localeinfo.obj
taskswitch.c を削除してコンパイルすれば、tcdll.tclockのサイズが1.6KBほど減ります。
タスクバーの改造機能のうち、「取っ手を消す」、「平らなトレイ」、「平らなタスクバー」、「タスクバーの透明度」のソースは dll/taskbar.c にあります。これらの機能をはずしてみましょう。
dll/main2.c の関数 InitClock から関数 InitTaskbar の呼び出しを取ります。
/* InitTaskbar(hwnd); // taskbar.c */
また、関数 RefreshTaskbar の呼び出しを取り、代わりにタスクバーを更新するコードを入れます。
/* RefreshTaskbar(hwnd); // taskbar.c */
PostMessage(GetParent(GetParent(hwnd)), WM_SIZE,
SIZE_RESTORED, 0);
InvalidateRect(GetParent(GetParent(hwnd)), NULL, TRUE);
関数 EndClock から関数 EndTaskbar の呼び出しを取ります。
/* EndTaskbar(hwnd); // taskbar.c */
InitClockと同様に、関数 RefreshTaskbar の呼び出しを取り、代わりにタスクバーを更新するコードを入れます。
/* RefreshTaskbar(hwnd); // taskbar.c */
PostMessage(GetParent(GetParent(hwnd)), WM_SIZE,
SIZE_RESTORED, 0);
InvalidateRect(GetParent(GetParent(hwnd)), NULL, TRUE);
dll/wndproc.cの中で、タスクバーをリセットしている部分を取ります。まず、関数宣言から関数 OnRefreshTaskbar を取り、
/* Statics */ static void OnTimerMain(HWND hwnd); static void OnRefreshClock(HWND hwnd); /* static void OnRefreshTaskbar(HWND hwnd); */ /* static void OnRefreshStartMenu(HWND hwnd); */
関数 WndProc からメッセージ CLOCKM_REFRESHTASKBAR の処理を取り、
/* case CLOCKM_REFRESHTASKBAR: // refresh other elements than clock
OnRefreshTaskbar(hwnd);
return 0; */
関数 OnRefreshTaskbar を全部取ります。
/* void OnRefreshTaskbar(HWND hwnd)
{
g_bVisualStyle = IsXPVisualStyle();
ResetStartButton(hwnd); // startbtn.c
InitTaskbar(hwnd); // taskbar.c
InitTaskSwitch(hwnd); // taskswitch.c
RefreshTaskbar(hwnd); // taskbar.c
} */
tcdll.mak で taskbar.obj をリンクしないようにします。
OBJS=dllmain.obj dllmain2.obj dllwndproc.obj draw.obj\
format.obj formattime.obj tooltip.obj userstr.obj\
startbtn.obj startmenu.obj taskbar.obj taskswitch.obj traynotify.obj\
bmp.obj newapi.obj dllutl.obj\
exec.obj utl.obj reg.obj font.obj localeinfo.obj
taskbar.c を削除してコンパイルすれば、tcdll.tclockのサイズが2KBほど減ります。
トレイの塗りつぶし機能は、dll/traynotify.c にあります。
dll/main2.c の関数 InitClock から関数 InitTrayNotify の呼び出しを取ります。
/* InitTrayNotify(hwnd); // traynotify.c */
関数 EndClock から関数 EndTrayNotify の呼び出しを取ります。
/* EndTrayNotify(); // traynotify.c */
dll/wndproc.cの関数 OnRefreshClock から関数 InitTrayNotify の呼び出しを取ります。
/* InitTrayNotify(hwnd); // traynotify.c */
tcdll.mak で traynotify.obj をリンクしないようにします。
OBJS=dllmain.obj dllmain2.obj dllwndproc.obj draw.obj\
format.obj formattime.obj tooltip.obj userstr.obj\
startbtn.obj startmenu.obj taskbar.obj taskswitch.obj traynotify.obj\
bmp.obj newapi.obj dllutl.obj\
exec.obj utl.obj reg.obj font.obj localeinfo.obj
traynotify.c を削除してコンパイルすれば、tcdll.tclockのサイズが1KBほど減ります。以上で tcdll.tclock の改造は終わりです。
これくらいやれば、tcdll.tclock のサイズが半分になるかと思ったけど、BCCでは47KB→30KBになっただけだった……
TClockのプロパティ(tcprop.exe)からタスクバー関連の設定ページをはずしてみましょう。
propery/main.cの冒頭で、定数 MAX_PAGE を3減らし、enum { 〜 } の中から PAGE_STARTBUTTON、PAGE_STARTMENU、PAGE_TASKBAR を取ります。
#define MAX_PAGE 9
enum {
PAGE_COLOR, PAGE_SIZE, PAGE_FORMAT,
PAGE_ALARM, PAGE_CUCKOO,
PAGE_MOUSE, PAGE_MOUSE2,
PAGE_TOOLTIP,
/* PAGE_SNTP, */
/* PAGE_STARTBUTTON, PAGE_STARTMENU, PAGE_TASKBAR, */
PAGE_MISC
};
構造体の配列 g_dlgPage を初期化している部分から、タスクバー関連の設定を取ります。
static struct {
HWND hDlg;
int idDlg;
DLGPROC dlgproc;
} g_dlgPage[MAX_PAGE] = {
(中略)
/* { NULL, IDD_PAGESTARTBUTTON, PageStartButtonProc }, /* PAGE_STARTBUTTON */
{ NULL, IDD_PAGESTARTMENU, PageStartMenuProc }, /* PAGE_STARTMENU */
{ NULL, IDD_PAGETASKBAR, PageTaskbarProc }, /* PAGE_TASKBAR */
*/
{ NULL, IDD_PAGEMISC, PageMiscProc }, /* PAGE_MISC */
};
定数 MAX_TREEITEM を4減らし、enum { 〜 } の中から ITEM_PARENTTASKBAR 〜 ITEM_TASKBAR を取ります。
#define MAX_TREEITEM 12
enum {
ITEM_PARENTCLOCK, ITEM_COLOR, ITEM_SIZE, ITEM_FORMAT,
ITEM_PARENTALARM, ITEM_ALARM, ITEM_CUCKOO,
ITEM_PARENTMOUSE, ITEM_CLICK, ITEM_MOUSEMISC,
ITEM_TOOLTIP,
/* ITEM_SNTP, */
/* ITEM_PARENTTASKBAR, ITEM_STARTBUTTON, ITEM_STARTMENU, ITEM_TASKBAR, */
ITEM_MISC
};
構造体の配列 g_treeItem を初期化している部分から、タスクバー関連の設定を取ります。
static struct {
int nParent;
int idStr;
char *entry;
int nPage;
} g_treeItem[MAX_TREEITEM] = {
(中略)
/* ITEM_PARENTTASKBAR */
/* { -1, IDS_TASKBAR, "Taskbar", PAGE_STARTBUTTON },
{ ITEM_PARENTTASKBAR, /* ITEM_STARTBUTTON */
IDS_STARTBUTTON, "Startbutton", PAGE_STARTBUTTON },
{ ITEM_PARENTTASKBAR, /* ITEM_STARTMENU */
IDS_STARTMENU, "Startmenu", PAGE_STARTMENU },
{ ITEM_PARENTTASKBAR, /* ITEM_TASKBAR */
IDS_TASKBAR, "Taskbar", PAGE_TASKBAR },
*/
/* ITEM_MISC */
{ -1, IDS_MISC, "Misc", PAGE_MISC },
};
property/tcprop.rc をテキストエディタで開き、IDD_PAGESTARTBUTTON、IDD_SELECTICON、IDD_PAGESTARTMENU、IDD_PAGETASKBAR の各ダイアログの記述を取ります。
IDD_PAGESTARTBUTTON DIALOG DISCARDABLE 0, 0, 210, 187 STYLE DS_CONTROL | WS_CHILD(中略)IDD_SELECTICON DIALOG DISCARDABLE 0, 0, 211, 97 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU(中略)IDD_PAGESTARTMENU DIALOG DISCARDABLE 0, 0, 210, 133 STYLE DS_CONTROL | WS_CHILD(中略)IDD_PAGETASKBAR DIALOG DISCARDABLE 0, 0, 210, 178 STYLE DS_CONTROL | WS_CHILD(中略)
「色とフォント」ページに「トレイを塗りつぶす」が残ってしまいますが、これを消したかったら、ダイアログ IDD_PAGECOLOR の記述の中でコントロール IDC_FILLTRAY に | NOT WS_VISIBLE を加えておけば、とりあえず見えなくなります。コントロール IDC_FILLTRAY を削除すると、property/pagecolor.c と tclang*.txtも修正しなければならなくなるので面倒です。
IDD_PAGECOLOR DIALOG DISCARDABLE 0, 0, 230, 163
STYLE DS_CONTROL | WS_CHILD
(中略)
CONTROL "Paint Tray background",IDC_FILLTRAY,"Button",
BS_AUTOCHECKBOX | WS_TABSTOP | NOT WS_VISIBLE,62,62,116,12
property/tcprop.makで、pagestartbtn.obj、selecticon.obj、pagestartmenu.obj、pagetaskbar.obj をリンクしないようにします。
OBJS=pagecolor.obj pagesize.obj pageformat.obj pageformat2.obj\
pagealarm.obj alarmday.obj pagecuckoo.obj\
pagemouse.obj pagemouse2.obj pagetooltip.obj\
pagestartbtn.obj selecticon.obj pagestartmenu.obj\
pagetaskbar.obj pagemisc.obj\
tclang.obj langcode.obj\
combobox.obj autoformat.obj localeinfo.obj selectfile.obj \
playfile.obj soundselect.obj alarmstruct.obj mousestruct.obj\
utl.obj exec.obj reg.obj font.obj
pagestartbtn.c、selecticon.c、pagestartmenu.c、pagetaskbar.c を削除してコンパイルすれば、tcprop.exe が12KBほど小さくなります。
タイマー(tctimer.exe)、時刻合わせ(tcsntp.exe)、音楽プレイヤー(tcplayer.exe)は独立したプログラムですので、はずすのは簡単です。
source ディレクトリの直下にある Makefile から、tctimer.mak、tcplayer.mak、tcsntp.mak の呼び出しをはずします。まず、Visual C++用の部分。
# $(MAKE) -f ..\timer\tctimer.mak SRCDIR=..\timer $(NODEFLIBOPT) # $(MAKE) -f ..\player\tcplayer.mak SRCDIR=..\player $(NODEFLIBOPT) # $(MAKE) -f ..\sntp\tcsntp.mak SRCDIR=..\sntp $(NODEFLIBOPT)
次にBCC用の部分。
# $(MAKE) -f ..\timer\tctimer.mak -D SRCDIR=..\timer $(NODEFLIBOPT) # $(MAKE) -f ..\player\tcplayer.mak -D SRCDIR=..\player $(NODEFLIBOPT) # $(MAKE) -f ..\sntp\tcsntp.mak -D SRCDIR=..\sntp $(NODEFLIBOPT)
ディレクトリ timer、player、sntpの下のソースは、ディレクトリごと削除してしまいます。
以上です。BCCでコンパイル後の実行ファイルは、次のようになります。

tcmenu*.txt からは タイマーと時刻合わせの部分を削除しておきます。tclang*.txt には不必要な記述が残りますが、別に害はありません。