ホーム | プログラミングTClock

2004-05-16記。

機能のはずし方

ここでは、TClock Lightからタスクバー関連などの機能をはずして、時計を改造するだけのTClock SuperLightを作る方法を紹介します。ここではずす機能は次のとおりです。

tclocksuperlight-040512.zip (ソースのみ)
このページで解説してある改造版のソースです。コンパイルのしかたは、TClock Lightのコンパイルを参照。

スタートボタンの改造をはずす

スタートボタンを改造しているソースは dll/startbtn.c にあります。

dll/main2.c

dll/main2.c の関数 InitClock から関数 InitStartButton の呼び出しを取ります。

     /* InitStartButton(hwnd);  // startbtn.c */

関数 EndClock から関数 EndStartButton の呼び出しを取ります。

     /* EndStartButton();   // startbtn.c */

関数 OnDestroy から関数 ClearStartButtonResource の呼び出しを取ります。

     /* ClearStartButtonResource(); // startbtn.c */

dll/wndproc.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

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

dll/main2.c の関数 InitClock から関数 InitStartMenu の呼び出しを取ります。

     /* InitStartMenu(hwnd);   // startmenu.c */

関数 EndClock から関数 EndStartMenu の呼び出しを取ります。

     /* EndStartMenu();     // startmenu.c */

関数 OnDestroy から関数 ClearStartMenuResource の呼び出しを取ります。

     /* ClearStartMenuResource();   // startmenu.c */

dll/wndproc.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);
} */

dll/taskbar.c

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)
{
    (中略)
} */

dll/tcdll.mak

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ほど減ります。

タスクバーの改造をはずす その1

タスクバーの改造機能のうち、「平らなタスクスイッチ」、「区切りを入れる」、「タスクスイッチにアイコンのみ表示」のソースは dll/taskswitch.c にあります。まず taskswitch.c の機能をはずしてみます。

dll/main2.c

dll/main2.c の関数 InitClock から関数 InitTaskSwitch の呼び出しを取ります。

     /* InitTaskSwitch(hwnd);  // taskswitch.c */

関数 EndClock から関数 EndTaskSwitch の呼び出しを取ります。

     /* EndTaskSwitch();    // taskswitch.c */

dll/wndproc.c

dll/wndproc.c の関数 OnRefreshTaskbar から関数 InitTaskSwitch の呼び出しを取ります。

     /* InitTaskSwitch(hwnd);   // taskswitch.c */

dll/tcdll.mak

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ほど減ります。

タスクバーの改造をはずす その2

タスクバーの改造機能のうち、「取っ手を消す」、「平らなトレイ」、「平らなタスクバー」、「タスクバーの透明度」のソースは dll/taskbar.c にあります。これらの機能をはずしてみましょう。

dll/main2.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

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
} */

dll/tcdll.mak

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

dll/main2.c の関数 InitClock から関数 InitTrayNotify の呼び出しを取ります。

     /* InitTrayNotify(hwnd);  // traynotify.c */

関数 EndClock から関数 EndTrayNotify の呼び出しを取ります。

     /* EndTrayNotify();    // traynotify.c */

dll/wndproc.c

dll/wndproc.cの関数 OnRefreshClock から関数 InitTrayNotify の呼び出しを取ります。

    /* InitTrayNotify(hwnd); // traynotify.c */

dll/tcdll.mak

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

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

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

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)は独立したプログラムですので、はずすのは簡単です。

Makefile

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でコンパイル後の実行ファイルは、次のようになります。

図:コンパイル後のTClock SuperLight

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