home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 2001 June / VPR0106A.BIN / OLS / TCL228 / TCL228.lzh / EXESRC.lzh / pagemouse.c < prev    next >
C/C++ Source or Header  |  1999-09-18  |  12KB  |  421 lines

  1. /*-------------------------------------------
  2.   pagemouse.c
  3.   「マウス操作」プロパティページ
  4.   KAZUBON 1997-1998
  5. ---------------------------------------------*/
  6.  
  7. #include "tclock.h"
  8.  
  9. static void OnInit(HWND hDlg);
  10. static void OnApply(HWND hDlg);
  11. static void OnSansho(HWND hDlg, WORD id);
  12. static void OnDropFilesChange(HWND hDlg);
  13. static void OnLClickChange(HWND hDlg);
  14.  
  15. static char section[] = "Mouse";
  16. static char* entryclick[] = { "LClick", "LDblClick",
  17.     "RClick", "RDblClick",
  18.     "MClick", "MDblClick" };
  19.  
  20. /*------------------------------------------------
  21.  「マウス操作」ページ用ダイアログプロシージャ
  22. --------------------------------------------------*/
  23. BOOL CALLBACK PageMouseProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
  24. {
  25.     switch(message)
  26.     {
  27.         case WM_INITDIALOG:
  28.             OnInit(hDlg);
  29.             return TRUE;
  30.         case WM_COMMAND:
  31.         {
  32.             WORD id, code;
  33.             id = LOWORD(wParam); code = HIWORD(wParam);
  34.             // 「ファイルのドロップ」
  35.             if(id == IDC_DROPFILES &&
  36.                 code == CBN_SELCHANGE)
  37.                 OnDropFilesChange(hDlg);
  38.             // 「左ボタン」
  39.             else if(id == IDC_LCLICK &&
  40.                 code == CBN_SELCHANGE)
  41.                 OnLClickChange(hDlg);
  42.             // エディットボックス変更
  43.             else if((id == IDC_DROPFILESAPP || id == IDC_LCLKFILE ||
  44.                 id == IDC_TOOLTIP) && code == EN_CHANGE)
  45.                 SendPSChanged(hDlg);
  46.             // ダブルクリック/クリック
  47.             else if(id == IDC_RADLDBLCLK || id == IDC_RADLCLK)
  48.                 SendPSChanged(hDlg);
  49.             // 「...」
  50.             else if(id == IDC_DROPFILESAPPSANSHO ||
  51.                 id == IDC_LCLKFILESANSHO)
  52.                 OnSansho(hDlg, id);
  53.             return TRUE;
  54.         }
  55.         case WM_NOTIFY:
  56.             switch(((NMHDR *)lParam)->code)
  57.             {
  58.                 case PSN_APPLY: OnApply(hDlg); break;
  59.                 case PSN_HELP: MyHelp(GetParent(hDlg), 4); break;
  60.             }
  61.             return TRUE;
  62.     }
  63.     return FALSE;
  64. }
  65.  
  66. /*------------------------------------------------
  67.  ページの初期化
  68. --------------------------------------------------*/
  69. void OnInit(HWND hDlg)
  70. {
  71.     char s[1024];
  72.     int button;
  73.     int n;
  74.     BOOL b;
  75.     int i;
  76.     HWND hDlgPage;
  77.     HFONT hfont;
  78.  
  79.     for(i = IDS_NONE; i <= IDS_MOVETO; i++)
  80.         CBAddString(hDlg, IDC_DROPFILES, (LPARAM)MyString(i));
  81.     CBSetCurSel(hDlg, IDC_DROPFILES, 
  82.         GetMyRegLong(section, "DropFiles", 0));
  83.     GetMyRegStr(section, "DropFilesApp", s, 1024, "");
  84.     SetDlgItemText(hDlg, IDC_DROPFILESAPP, s);
  85.     
  86.     button = 1;
  87.     if(GetMyRegLong(section, entryclick[0], -1) >= 0) button = 0;
  88.     if(GetMyRegLong(section, entryclick[1], -1) >= 0) button = 1;
  89.     CheckDlgButton(hDlg, (button==1)?IDC_RADLDBLCLK:IDC_RADLCLK, TRUE);
  90.     
  91.     for(i = IDS_PROPDATE; i <= IDS_OPENFILE; i++)
  92.         CBAddString(hDlg, IDC_LCLICK, (LPARAM)MyString(i));
  93.  
  94.     n = GetMyRegLong(section, entryclick[button], 0);
  95.     if(n == 100) n = 7;
  96.     CBSetCurSel(hDlg, IDC_LCLICK, n);
  97.     
  98.     b = GetMyRegLong("", "StartButtonHide", FALSE);
  99.     if(b) b = GetMyRegLong("", "StartMenuClock", FALSE);
  100.     // 「タスクバー」ページの「時計にスタートメニュー」が
  101.     // チェックされているかどうか
  102.     hDlgPage = GetTopWindow(GetParent(hDlg));
  103.     while(hDlgPage)
  104.     {
  105.         if(GetDlgItem(hDlgPage, IDC_STARTBTNHIDE))
  106.         {
  107.             b = IsDlgButtonChecked(hDlgPage, IDC_STARTBTNHIDE);
  108.             if(b) b = IsDlgButtonChecked(hDlgPage, IDC_STARTMENUCLOCK);
  109.             break;
  110.         }
  111.         hDlgPage = GetNextWindow(hDlgPage, GW_HWNDNEXT);
  112.     }
  113.     for(i = IDC_LABLCLK; i <= IDC_LCLKFILESANSHO; i++)
  114.         EnableDlgItem(hDlg, i, !b);
  115.  
  116.     OnDropFilesChange(hDlg);
  117.     OnLClickChange(hDlg);
  118.  
  119.     hfont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
  120.     if(hfont)
  121.         SendDlgItemMessage(hDlg, IDC_TOOLTIP, WM_SETFONT, (WPARAM)hfont, 0);
  122.     
  123.     GetMyRegStr("Tooltip", "Tooltip", s, 1024, "");
  124.     if(s[0] == 0) strcpy(s, "\"TClock\" LDATE");
  125.     SetDlgItemText(hDlg, IDC_TOOLTIP, s);
  126. }
  127.  
  128. /*------------------------------------------------
  129.  更新
  130. --------------------------------------------------*/
  131. void OnApply(HWND hDlg)
  132. {
  133.     char s[1024];
  134.     char entryfile[20];
  135.     int button;
  136.     int n;
  137.     
  138.     n = CBGetCurSel(hDlg, IDC_DROPFILES);
  139.     SetMyRegLong("", "DropFiles", n > 0);
  140.     SetMyRegLong(section, "DropFiles", n);
  141.     GetDlgItemText(hDlg, IDC_DROPFILESAPP, s, 1024);
  142.     SetMyRegStr(section, "DropFilesApp", s);
  143.     
  144.     button = 1;
  145.     if(IsDlgButtonChecked(hDlg, IDC_RADLCLK)) button = 0;
  146.     
  147.     n = CBGetCurSel(hDlg, IDC_LCLICK);
  148.     if(n == 7) n = 100;
  149.     SetMyRegLong(section, entryclick[button], n);
  150.     DelMyReg(section, entryclick[(button == 0)?1:0]);
  151.     
  152.     GetDlgItemText(hDlg, IDC_LCLKFILE, s, 1024);
  153.     if(n == 100)
  154.     {
  155.         strcpy(entryfile, entryclick[button]);
  156.         strcat(entryfile, "File");
  157.         SetMyRegStr(section, entryfile, s);
  158.     }
  159.     else if(n == 6)
  160.     {
  161.         SetMyRegStr(section, "ClipFormat", s);
  162.     }
  163.     
  164.     GetDlgItemText(hDlg, IDC_TOOLTIP, s, 1024);
  165.     SetMyRegStr("Tooltip", "Tooltip", s);
  166. }
  167.  
  168. /*------------------------------------------------
  169.  「ファイルのドロップ」
  170. --------------------------------------------------*/
  171. void OnDropFilesChange(HWND hDlg)
  172. {
  173.     int i, n;
  174.     n = CBGetCurSel(hDlg, IDC_DROPFILES);
  175.     SetDlgItemText(hDlg, IDC_LABDROPFILESAPP,
  176.         MyString(n >= 3?IDS_LABFOLDER:IDS_LABPROGRAM));
  177.     for(i = IDC_LABDROPFILESAPP; i <= IDC_DROPFILESAPPSANSHO; i++)
  178.         ShowDlgItem(hDlg, i, (2 <= n && n <= 4));
  179.     SendPSChanged(hDlg);
  180. }
  181.  
  182. /*------------------------------------------------
  183.  「左ボタン」
  184. --------------------------------------------------*/
  185. void OnLClickChange(HWND hDlg)
  186. {
  187.     char s[1024];
  188.     int n;
  189.     n = CBGetCurSel(hDlg, IDC_LCLICK);
  190.     ShowDlgItem(hDlg, IDC_LABLCLKFILE, (n == 6||n == 7));
  191.     ShowDlgItem(hDlg, IDC_LCLKFILE, (n == 6||n == 7));
  192.     ShowDlgItem(hDlg, IDC_LCLKFILESANSHO, n == 7);
  193.     if(n == 6)
  194.     {
  195.         GetMyRegStr(section, "ClipFormat", s, 1024, "");
  196.         if(s[0] == 0) GetMyRegStr("", "Format", s, 1024, "");
  197.         SetDlgItemText(hDlg, IDC_LCLKFILE, s);
  198.         SetDlgItemText(hDlg, IDC_LABLCLKFILE, MyString(IDS_FORMAT));
  199.     }
  200.     else if(n == 7)
  201.     {
  202.         char entryfile[20];
  203.         int button;
  204.         
  205.         button = 1;
  206.         if(IsDlgButtonChecked(hDlg, IDC_RADLCLK)) button = 0;
  207.         strcpy(entryfile, entryclick[button]);
  208.         strcat(entryfile, "File");
  209.         GetMyRegStr(section, entryfile, s, 1024, "");
  210.         SetDlgItemText(hDlg, IDC_LCLKFILE, s);
  211.         SetDlgItemText(hDlg, IDC_LABLCLKFILE, MyString(IDS_FILE));
  212.     }
  213.     SendPSChanged(hDlg);
  214. }
  215.  
  216. /*------------------------------------------------
  217.  「...」 ファイルの参照
  218. --------------------------------------------------*/
  219. void OnSansho(HWND hDlg, WORD id)
  220. {
  221.     int n;
  222.     OPENFILENAME ofn;
  223.     char filter[80];
  224.     char fname[MAX_PATH], ftitle[MAX_PATH], initdir[MAX_PATH];
  225.     
  226.     if(id == IDC_DROPFILESAPPSANSHO)
  227.     {
  228.         n = CBGetCurSel(hDlg, IDC_DROPFILES);
  229.         if(n >= 3)
  230.         {
  231.             BROWSEINFO bi;
  232.             LPITEMIDLIST pidl;
  233.             memset(&bi, 0, sizeof(BROWSEINFO));
  234.             bi.hwndOwner = hDlg;
  235.             bi.ulFlags = BIF_RETURNONLYFSDIRS;
  236.             pidl = SHBrowseForFolder(&bi);
  237.             if(pidl)
  238.             {
  239.                 SHGetPathFromIDList(pidl, fname);
  240.                 SetDlgItemText(hDlg, id - 1, fname);
  241.                 PostMessage(hDlg, WM_NEXTDLGCTL, 1, FALSE);
  242.                 SendPSChanged(hDlg);
  243.             }
  244.             return;
  245.         }
  246.     }
  247.     
  248.     memset(&ofn, '\0', sizeof(OPENFILENAME));
  249.     
  250.     filter[0] = 0;
  251.     if(id == IDC_DROPFILESAPPSANSHO)
  252.     {
  253.         str0cat(filter, MyString(IDS_PROGRAMFILE));
  254.         str0cat(filter, "*.exe");
  255.     }
  256.     str0cat(filter, MyString(IDS_ALLFILE));
  257.     str0cat(filter, "*.*");
  258.     
  259.     GetDlgItemText(hDlg, id - 1, initdir, MAX_PATH);
  260.     if(initdir[0])
  261.     {
  262.         WIN32_FIND_DATA fd;
  263.         HANDLE hfind;
  264.         hfind = FindFirstFile(initdir, &fd);
  265.         if(hfind != INVALID_HANDLE_VALUE)
  266.         {
  267.             FindClose(hfind);
  268.             del_title(initdir);
  269.         }
  270.         else strcpy(initdir, mydir);
  271.     }
  272.     else strcpy(initdir, mydir);
  273.     
  274.     fname[0] = 0;
  275.     ofn.lStructSize = sizeof(OPENFILENAME);
  276.     ofn.hwndOwner = hDlg;
  277.     ofn.hInstance = hInst;
  278.     ofn.lpstrFilter = filter;
  279.     ofn.lpstrFile= fname;
  280.     ofn.nMaxFile = MAX_PATH;
  281.     ofn.lpstrFileTitle = ftitle;
  282.     ofn.nMaxFileTitle = MAX_PATH;
  283.     ofn.lpstrInitialDir = initdir;
  284.     ofn.Flags = OFN_HIDEREADONLY|OFN_EXPLORER|OFN_FILEMUSTEXIST;
  285.     
  286.     if(!GetOpenFileName(&ofn)) return;
  287.     
  288.     SetDlgItemText(hDlg, id - 1, ofn.lpstrFile);
  289.     PostMessage(hDlg, WM_NEXTDLGCTL, 1, FALSE);
  290.     SendPSChanged(hDlg);
  291. }
  292.  
  293. /*------------------------------------------------
  294.  ファイルがドロップされたときの実際の処理
  295. --------------------------------------------------*/
  296. void OnDropFiles(HWND hwnd, HDROP hdrop)
  297. {
  298.     char fname[MAX_PATH], sname[MAX_PATH];
  299.     char app[1024];
  300.     SHFILEOPSTRUCT shfos;
  301.     char *buf, *p;
  302.     int i, num;
  303.     int nType;
  304.     
  305.     nType = GetMyRegLong(section, "DropFiles", 0);
  306.     
  307.     num = DragQueryFile(hdrop, (UINT)-1, NULL, 0);
  308.     if(num <= 0) return;
  309.     buf = malloc(num*MAX_PATH);
  310.     if(buf == NULL) return;
  311.     p = buf;
  312.     for(i = 0; i < num; i++)
  313.     {
  314.         DragQueryFile(hdrop, i, fname, MAX_PATH);
  315.         if(nType == 1 || nType == 3 || nType == 4)  // ごみ箱、コピー、移動
  316.         {                             // '\0'で区切られたファイル名
  317.             strcpy(p, fname); p += strlen(p) + 1;
  318.         }
  319.         else if(nType == 2) //プログラムで開く:
  320.         {                   //スペースで区切られた短いファイル名
  321.             if(num > 1) GetShortPathName(fname, sname, MAX_PATH);
  322.             else strcpy(sname, fname);
  323.             strcpy(p, sname);
  324.             p += strlen(p);
  325.             if(num > 1 && i < num - 1) { *p = ' '; p++; }
  326.         }
  327.     }
  328.     *p = 0;
  329.     DragFinish(hdrop);
  330.     
  331.     GetMyRegStr(section, "DropFilesApp", app, 1024, "");
  332.     
  333.     if(nType == 1 || nType == 3 || nType == 4)  // ごみ箱、コピー、移動
  334.     {
  335.         memset(&shfos, 0, sizeof(SHFILEOPSTRUCT));
  336.         shfos.hwnd = NULL;
  337.         if(nType == 1) shfos.wFunc = FO_DELETE;
  338.         else if(nType == 3) shfos.wFunc = FO_COPY;
  339.         else if(nType == 4) shfos.wFunc = FO_MOVE;
  340.         shfos.pFrom = buf;
  341.         if(nType == 3 || nType == 4) shfos.pTo = app;
  342.         shfos.fFlags = FOF_ALLOWUNDO|FOF_NOCONFIRMATION;
  343.         SHFileOperation(&shfos);
  344.     }
  345.     else if(nType == 2) //ファイルで開く
  346.     {
  347.         char command[MAX_PATH*2];
  348.         
  349.         strcpy(command, app);
  350.         strcat(command, " ");
  351.         strcat(command, buf);
  352.         ExecFile(hwnd, command);
  353.     }
  354.     free(buf);
  355. }
  356.  
  357. /*------------------------------------------------
  358.  ファイルのクリック/ダブルクリックの実際の処理
  359. --------------------------------------------------*/
  360. void OnClick(HWND hwnd, UINT message, int fwKeys, int x, int y)
  361. {
  362.     HWND hwndTray;
  363.     int nType;
  364.     WPARAM wParam;
  365.     int button;
  366.     BOOL b;
  367.  
  368.     if(message == WM_LBUTTONDOWN) button = 0;
  369.     else if(message == WM_LBUTTONDBLCLK) button = 1;
  370.     else if(message == WM_RBUTTONDOWN) button = 2;
  371.     else if(message == WM_RBUTTONDBLCLK) button = 3;
  372.     else if(message == WM_MBUTTONDOWN) button = 4;
  373.     else if(message == WM_MBUTTONDBLCLK) button = 5;
  374.     else return;
  375.     
  376.     if(button == 0 || button == 1)
  377.     {
  378.         b = GetMyRegLong("", "StartButtonHide", FALSE);
  379.         if(b) b = GetMyRegLong("", "StartMenuClock", FALSE);
  380.         if(b) return;
  381.     }
  382.     
  383.     nType = GetMyRegLong(section, entryclick[button], -1);
  384.     if(nType < 0)
  385.     {
  386.         if(button == 1)
  387.         {
  388.             if(GetMyRegLong(section, entryclick[0], -1) >= 0)
  389.                 return;
  390.             nType = 0;
  391.         }
  392.         else return;
  393.     }
  394.  
  395.     if(0 <= nType && nType <= 3)
  396.     {
  397.         if(nType == 0) wParam = 408;      // 日付と時刻のプロパティ
  398.         else if(nType == 1) wParam = 506; // Windowsの終了
  399.         else if(nType == 2) wParam = 401; // ファイル名を指定して実行
  400.         else if(nType == 3) wParam = 415; // すべてのウィンドウを最小化
  401.         hwndTray = FindWindow("Shell_TrayWnd", NULL);
  402.         if(hwndTray) PostMessage(hwndTray, WM_COMMAND, wParam, 0);
  403.     }
  404.     else if(nType == 4)
  405.         StartSyncTime(hwndMain, NULL, 0);
  406.     else if(nType == 5)
  407.         DialogTimer(hwndMain);
  408.     else if(nType == 6)
  409.         PostMessage(hwndClock, WM_COMMAND, 105, 0);
  410.     
  411.     else if(nType == 100) // ファイルを開く
  412.     {
  413.         char fname[1024];
  414.         char entryfile[20];
  415.         strcpy(entryfile, entryclick[button]);
  416.         strcat(entryfile, "File");
  417.         if(GetMyRegStr(section, entryfile, fname, 1024, "") > 0)
  418.             ExecFile(hwnd, fname);
  419.     }
  420. }
  421.