3.Àбâ¸ðµå

°¡.Àбâ¸ðµå

 

Àб⠸ðµå¶õ ¼Ò¼³Ã¥À̳ª ±ä °Ô½Ã¹°À» ÀÐÀ» ¶§ ¼öµ¿À¸·Î ½ºÅ©·ÑÇÏÁö ¾Ê¾Æµµ ÁÖ±âÀûÀ¸·Î ½ºÅ©·ÑÇÔÀ¸·Î½á Æí¸®ÇÏ°Ô µ¶¼­¸¦ ÇÒ ¼ö ÀÖµµ·Ï µµ¿ÍÁÖ´Â ±â´ÉÀÌ´Ù. ÀÚµ¿ ½ºÅ©·ÑÀ» ÇÏ´Â °Í »Ó¸¸ ¾Æ´Ï¶ó ¹Ì¸® ÁöÁ¤µÈ ±Û²Ã, ÁÙ°£, °³Çà ¸ðµå¸¦ Àû¿ëÇÏ¿© µ¶¼­¿¡ °¡Àå Æí¸®ÇÑ ¼³Á¤À¸·Î Çѹø¿¡ º¯È¯Çϱ⵵ ÇÑ´Ù. ÆíÁýÇÒ ¶§¿Í´Â ´Þ¸® ±ä ±ÛÀ» ÀÐÀ» ¶§´Â ±Û²ÃÀ» Á» Å©°Ô Çϰí ÁÙ°£µµ ¿©À¯ÀÖ°Ô ÁÖ´Â °ÍÀÌ ½Ã¿ø½º·´´Ù. ÀÌ ¸ðµå¿¡¼­´Â ÀÚµ¿ ½ºÅ©·ÑµÇ´Â ÅØ½ºÆ®¸¦ ¸ÛûÇÏ°Ô ¾É¾Æ¼­ Àб⸸ ÇÏ¸é µÈ´Ù.

°³ÀÎÀûÀ¸·Î ÀÌ·± °£Áö·¯¿î ±â´ÉÀ» º°·Î ÁÁ¾ÆÇÏÁö´Â ¾ÊÁö¸¸ ÄÄÇ»ÅÍ·Î ±ÛÀ» ÀÚÁÖ Àд »ç¶÷µéÀº º°µµÀÇ ºä¾î¸¦ »ç¿ëÇÒ Á¤µµ·Î ÀÌ ±â´ÉÀÌ À¯¿ëÇÏ´Ù°í ÇÑ´Ù. ÇÏ±ä ¸Å¹ø µ¶¼­¿ë ±Û²Ã·Î º¯°æÇÏ´Â °Íµµ ¹«Ã´ ±ÍÂú°í ¼ÕÀ̳ª ¸¶¿ì½º·Î ½ºÅ©·ÑÇϸ鼭 Àд °Íµµ µ¶¼­¿¡ ¹æÇذ¡ µÉ °ÍÀÌ´Ù. ¸ÕÀú Àб⠸ðµå¿¡ °ü·ÃµÈ ¿É¼ÇµéÀ» Á¤ÀÇÇϰí ÃʱâÈ­ ¹× ÀúÀå, º¹±¸ÇÑ´Ù.

 

struct SOption

{

     ....

     BOOL RmWrap;

     LOGFONT Rmlogfont;

     int RmLineRatio;

     int RmFreq;

     int RmLineNum;

     int RmManual;

};

 

void SOption::Init()

{

     ...

     RmWrap=TRUE;

     memset(&Rmlogfont,0,sizeof(LOGFONT));

     Rmlogfont.lfHeight=20;

     lstrcpy(Rmlogfont.lfFaceName,"±¼¸²");

     Rmlogfont.lfPitchAndFamily=VARIABLE_PITCH | FF_ROMAN;

     Rmlogfont.lfCharSet=HANGEUL_CHARSET;

     RmLineRatio=200;

     RmFreq=35;

     RmLineNum=1;

     RmManual=1;

}

 

void SOption::Load(TCHAR *Key)

{

     ....

     RmWrap=SHRegReadInt(SHCU,szKey,"RmWrap",0);

     SHRegReadString(SHCU,szKey,"RmFaceName","",Rmlogfont.lfFaceName,32);

     Rmlogfont.lfPitchAndFamily=SHRegReadInt(SHCU,szKey,"RmPitchAndFamily",0);

     Rmlogfont.lfCharSet=SHRegReadInt(SHCU,szKey,"RmCharSet",0);

     Rmlogfont.lfHeight=SHRegReadInt(SHCU,szKey,"RmFontHeight",0);

     RmLineRatio=SHRegReadInt(SHCU,szKey,"RmLineRatio",0);

     RmFreq=SHRegReadInt(SHCU,szKey,"RmFreq",0);

     RmLineNum=SHRegReadInt(SHCU,szKey,"RmLineNum",0);

     RmManual=SHRegReadInt(SHCU,szKey,"RmManual",0);

 

void SOption::Save(TCHAR *Key)

{

     ....

     SHRegWriteInt(SHCU,szKey,"RmWrap",RmWrap);

     SHRegWriteString(SHCU,szKey,"RmFaceName",Rmlogfont.lfFaceName);

     SHRegWriteInt(SHCU,szKey,"RmPitchAndFamily",Rmlogfont.lfPitchAndFamily);

     SHRegWriteInt(SHCU,szKey,"RmCharSet",Rmlogfont.lfCharSet);

     SHRegWriteInt(SHCU,szKey,"RmFontHeight",Rmlogfont.lfHeight);

     SHRegWriteInt(SHCU,szKey,"RmLineRatio",RmLineRatio);

     SHRegWriteInt(SHCU,szKey,"RmFreq",RmFreq);

     SHRegWriteInt(SHCU,szKey,"RmLineNum",RmLineNum);

     SHRegWriteInt(SHCU,szKey,"RmManual",RmManual);

 

Dangeun.cpp¿¡ Àб⠸ðµå¸¦ ½ÃÀÛÇÏ´Â ÇÔ¼ö¸¦ ÀÛ¼ºÇÑ´Ù.

 

void ReadMode()

{

     HWND hActive;

     SInfo *pSi;

     LOGFONT OldFont;

     int OldLineRatio;

     int OldWrap;

 

     hActive=(HWND)SendMessage(g_hMDIClient,WM_MDIGETACTIVE,0,NULL);

     if (hActive == NULL) {

          return;

     }

     pSi=(SInfo *)GetWindowLong(hActive,0);

 

     // ÀÌÀü ¼³Á¤ ÀúÀå

     pSi->Ae.GetFont(&OldFont);

     OldLineRatio=pSi->Ae.GetLineRatio();

     OldWrap=pSi->Ae.GetWrap();

 

     DialogBox(g_hInst,MAKEINTRESOURCE(IDD_READMODE),g_hFrameWnd,ReadModeProc);

 

     // ¼³Á¤ º¹±¸

     pSi->Ae.SetFont(&OldFont);

     pSi->Ae.SetLineRatio(OldLineRatio);

     pSi->Ae.SetWrap(OldWrap);

}

 

Ȱ¼ºÃ¢¿¡ ´ëÇØ ÀÌÀü ¼³Á¤À» ¸ÕÀú ÀúÀåÇØ ³õ°í Àб⠸ðµå ´ëÈ­»óÀÚ¸¦ ¸ð´Þ·Î ¿¬´Ù. ´ëÈ­»óÀÚ°¡ Á¾·áµÇ¸é ÀúÀåÇØ ³õÀº ¿ø·¡ ¼³Á¤À» º¹±¸ÇÑ´Ù. ÀÌ ÇÔ¼ö´Â µµ±¸/Àб⠸ðµå¿¡¼­ È£ÃâÇÑ´Ù.

 

void OnCommand(HWND hWnd,WPARAM wParam,LPARAM lParam)

{

     ....

     case IDM_TOOL_READMODE:

          ReadMode();

          break;

 

Àб⠸ðµå ±â´ÉÀÇ ´ëºÎºÐÀº ¸ð´Þ ´ëÈ­»óÀÚ°¡ Á¦°øÇÑ´Ù.

 

BOOL CALLBACK ReadModeProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam)

{

     HWND hActive;

     SInfo *pSi;

     static CApiEdit *Ae;

     TCHAR szCap[64];

     int i,idx,Value;

     UDACCEL Accel;

     LOGFONT tFont;

     HDC hdc;

     RECT wrt,drt;

     int dx,dy;

 

     switch(iMessage) {

     case WM_INITDIALOG:

          hActive=(HWND)SendMessage(g_hMDIClient,WM_MDIGETACTIVE,0,NULL);

          pSi=(SInfo *)GetWindowLong(hActive,0);

          Ae=&pSi->Ae;

          // ÄÁÆ®·ÑÀÇ °ª ÀÐÀ½

          if (arFont==NULL) {

              DgEnumFonts();

          }

          SendDlgItemMessage(hDlg,IDC_RMFONT,CB_ADDSTRING,0,(LPARAM)"==½Ã½ºÅÛ==");

          for (i=0;i<FontNum;i++) {

              SendDlgItemMessage(hDlg,IDC_RMFONT,CB_ADDSTRING,0,(LPARAM)arFont[i].lfFaceName);

          }

          if (Option.Rmlogfont.lfHeight == 0) {

              idx=0;

          } else {

              idx=SendDlgItemMessage(hDlg,IDC_RMFONT,CB_FINDSTRING,-1,

                   (LPARAM)Option.Rmlogfont.lfFaceName);

              SetDlgItemInt(hDlg,IDC_RMFONTSIZE,Option.Rmlogfont.lfHeight,FALSE);

          }

          SendDlgItemMessage(hDlg,IDC_RMFONT,CB_SETCURSEL,idx,0);

          SetDlgItemInt(hDlg,IDC_RMLINERATIO,Option.RmLineRatio,FALSE);

          sprintf(szCap,"ÁÖ±â:%.1fÃÊ",(double)Option.RmFreq/10);

          SetDlgItemText(hDlg,IDC_RMFREQ,szCap);

          wsprintf(szCap,"ÁÙ¼ö:%d",Option.RmLineNum);

          SetDlgItemText(hDlg,IDC_RMLINENUM,szCap);

          SetDlgItemInt(hDlg,IDC_RMMANUAL,Option.RmManual,FALSE);

          CheckDlgButton(hDlg,IDC_RMWRAP,Option.RmWrap ? BST_CHECKED:BST_UNCHECKED);

          SendDlgItemMessage(hDlg,IDC_RMSPINFONTSIZE,UDM_SETRANGE,0,MAKELPARAM(72,8));

          SendDlgItemMessage(hDlg,IDC_RMSPINLINERATIO,UDM_SETRANGE,0,MAKELPARAM(500,100));

          SendDlgItemMessage(hDlg,IDC_RMSPINMANUAL,UDM_SETRANGE,0,MAKELPARAM(100,1));

          Accel.nSec=1;

          Accel.nInc=10;

          SendDlgItemMessage(hDlg,IDC_RMSPINLINERATIO,UDM_SETACCEL,1,(LPARAM)&Accel);

          SendDlgItemMessage(hDlg,IDC_RMSLFREQ,TBM_SETRANGE,FALSE,MAKELPARAM(1,300));

          SendDlgItemMessage(hDlg,IDC_RMSLFREQ,TBM_SETPOS,TRUE,Option.RmFreq);

          SendDlgItemMessage(hDlg,IDC_RMSLLINENUM,TBM_SETRANGE,FALSE,MAKELPARAM(1,10));

          SendDlgItemMessage(hDlg,IDC_RMSLLINENUM,TBM_SETPOS,TRUE,Option.RmLineNum);

 

          // ApiEditÀÇ ¿É¼Ç º¯°æ

          SendMessage(hDlg,WM_COMMAND,MAKEWPARAM(IDC_RMWRAP,0),0);

          SendMessage(hDlg,WM_COMMAND,MAKEWPARAM(IDC_RMLINERATIO,EN_CHANGE),0);

          SendMessage(hDlg,WM_COMMAND,MAKEWPARAM(IDC_RMFONTSIZE,EN_CHANGE),0);

 

          // ´ëÈ­»óÀÚÀÇ À§Ä¡ Á¶Á¤

          GetWindowRect(GetParent(hDlg),&wrt);

          GetWindowRect(hDlg,&drt);

          dx=wrt.right;

          dy=wrt.bottom-(drt.bottom-drt.top);

          if (dx+(drt.right-drt.left) > GetSystemMetrics(SM_CXSCREEN)) {

              dx=GetSystemMetrics(SM_CXSCREEN)-(drt.right-drt.left);

          }

          if (dy+(drt.bottom-drt.top) > GetSystemMetrics(SM_CYSCREEN)) {

              dy=GetSystemMetrics(SM_CYSCREEN)-(drt.bottom-drt.top);

          }

          SetWindowPos(hDlg,HWND_NOTOPMOST,dx,dy,0,0,SWP_NOSIZE);

 

          SetFocus(GetDlgItem(hDlg,IDC_RMAUTOSCROLL));

          return FALSE;

     case WM_COMMAND:

          switch (LOWORD(wParam)) {

          case IDC_RMAUTOSCROLL:

              if (IsDlgButtonChecked(hDlg,IDC_RMAUTOSCROLL)==BST_CHECKED) {

                   Value=SendMessage(GetDlgItem(hDlg,IDC_RMSLFREQ),TBM_GETPOS,0,0);

                   SetTimer(hDlg,1,Value*100,NULL);

              } else {

                   KillTimer(hDlg,1);

              }

              return TRUE;

          case IDC_RMWRAP:

              if (IsDlgButtonChecked(hDlg,IDC_RMWRAP)==BST_CHECKED) {

                   Ae->SetWrap(Option.nWrap);

                   Option.RmWrap=TRUE;

              } else {

                   Ae->SetWrap(0);

                   Option.RmWrap=FALSE;

              }

              return TRUE;

          case IDC_RMFONT:

              if (HIWORD(wParam)==CBN_SELCHANGE) {

                   idx=SendDlgItemMessage(hDlg,IDC_RMFONT,CB_GETCURSEL,0,0);

                   if (idx==0) {

                        Option.Rmlogfont.lfHeight=0;

                   } else {

                        SendDlgItemMessage(hDlg,IDC_RMFONT,CB_GETLBTEXT,idx,(LPARAM)szCap);

                        for (i=0;i<FontNum;i++) {

                            if (lstrcmp(szCap,arFont[i].lfFaceName) == 0)

                                 break;

                        }

                        Option.Rmlogfont=arFont[i];

                        Option.Rmlogfont.lfHeight=GetDlgItemInt(hDlg,IDC_RMFONTSIZE,NULL,FALSE);

                   }

                   tFont=Option.Rmlogfont;

                   hdc=GetDC(NULL);

                   tFont.lfHeight=tFont.lfHeight*GetDeviceCaps(hdc,LOGPIXELSY)/72;

                   tFont.lfWidth=0;

                   ReleaseDC(NULL,hdc);

                   Ae->SetFont(&tFont);

              }

              return TRUE;

          case IDC_RMFONTSIZE:

              if (HIWORD(wParam)==EN_CHANGE) {

                   Value=GetDlgItemInt(hDlg,IDC_RMFONTSIZE,NULL,FALSE);

                   if (Value) {

                        Option.Rmlogfont.lfHeight=Value;

                        tFont=Option.Rmlogfont;

                        hdc=GetDC(NULL);

                        tFont.lfHeight=tFont.lfHeight*GetDeviceCaps(hdc,LOGPIXELSY)/72;

                        tFont.lfWidth=0;

                        ReleaseDC(NULL,hdc);

                        Ae->SetFont(&tFont);

                   }

              }

              return TRUE;

          case IDC_RMLINERATIO:

               if (HIWORD(wParam)==EN_CHANGE) {

                   Value=GetDlgItemInt(hDlg,IDC_RMLINERATIO,NULL,FALSE);

                   if (Value) {

                        Option.RmLineRatio=Value;

                        Ae->SetLineRatio(Value);

                   }

              }

              return TRUE;

          case IDC_RMMANUAL:

              if (HIWORD(wParam)==EN_CHANGE) {

                   Value=GetDlgItemInt(hDlg,IDC_RMMANUAL,NULL,FALSE);

                   if (Value) {

                        Option.RmManual=Value;

                   }

              }

              return TRUE;

          case IDC_RMBTNMANUAL:

              Value=GetDlgItemInt(hDlg,IDC_RMMANUAL,NULL,FALSE);

              Ae->GetActiveView()->Scroll(Value);

              return TRUE;

          case IDCANCEL:

              EndDialog(hDlg,IDCANCEL);

              return TRUE;

          }

          return FALSE;

     case WM_TIMER:

          Ae->GetActiveView()->Scroll(Option.RmLineNum);

          return TRUE;

     case WM_HSCROLL:

          if ((HWND)lParam == GetDlgItem(hDlg,IDC_RMSLFREQ)) {

              Option.RmFreq=SendMessage(GetDlgItem(hDlg,IDC_RMSLFREQ),TBM_GETPOS,0,0);

              sprintf(szCap,"ÁÖ±â:%.1fÃÊ",(double)Option.RmFreq/10);

              SetDlgItemText(hDlg,IDC_RMFREQ,szCap);

              SendMessage(hDlg,WM_COMMAND,MAKEWPARAM(IDC_RMAUTOSCROLL,0),0);

          }

          if ((HWND)lParam == GetDlgItem(hDlg,IDC_RMSLLINENUM)) {

              Option.RmLineNum=SendMessage(GetDlgItem(hDlg,IDC_RMSLLINENUM),TBM_GETPOS,0,0);

              wsprintf(szCap,"ÁÙ¼ö:%d",Option.RmLineNum);

              SetDlgItemText(hDlg,IDC_RMLINENUM,szCap);

          }

          return TRUE;

     }

     return FALSE;

}

 

Àб⠸ðµå ´ëÈ­»óÀÚ´Â ¸ÞÀÎ À©µµ¿ìÀÇ ¿ìÃø ¾Æ·¡¿¡ ¿­¸®¸ç ¹Ì¸® ¼³Á¤µÈ ¿É¼Ç´ë·Î Ȱ¼ºÃ¢ÀÇ ¼³Á¤À» º¯°æÇÏ¿© Å« ±Û²Ã°ú ³ÐÀº ÁÙ°£À¸·Î ÀüȯÇÑ´Ù. ¶ÇÇÑ ÀÌ ´ëÈ­»óÀÚ¿¡¼­ ¿É¼ÇÀ» º¯°æÇϸé Ȱ¼ºÃ¢¿¡ Áï½Ã Àû¿ëµÇ¹Ç·Î ±Û²ÃÀ̳ª ÁÙ°£À» Á¶Á¤Çϱ⵵ ½±´Ù. ÀÚµ¿ ½ºÅ©·Ñ ±â´ÉÀº ±¸ÇöÇϱ⠾ÆÁÖ ½¬¿îµ¥ ŸÀ̸Ӹ¦ ¼³Ä¡ÇØ ³õ°í ÀÏÁ¤ÇÑ °£°ÝÀ¸·Î ½ºÅ©·Ñ ¸Þ½ÃÁö¸¸ º¸³»¸é µÈ´Ù. ±ÛÀ» Àд ¼Óµµ°¡ °¡º¯ÀûÀÎ »ç¶÷Àº ÀÚµ¿ ½ºÅ©·Ñ Áß¿¡µµ ¼öµ¿À¸·Î ½ºÅ©·ÑÇÒ ¼öµµ ÀÖ°í ÀÚµ¿ ½ºÅ©·ÑÀ» Àá½Ã ÁßÁöÇÒ ¼öµµ ÀÖ´Ù.

ÀÌ ´ëÈ­»óÀÚ´Â ¸ð´ÞÀ̹ǷΠÀб⠸ðµå »óÅ¿¡¼­´Â ¸ÞÀÎ À©µµ¿ì¸¦ Á¶ÀÛÇÒ ¼ö ¾ø´Ù. Àб⠸ðµå¸¦ ³¡³»·Á¸é ´ëÈ­»óÀÚ¸¦ ´Ý¾Æ¾ß ÇÑ´Ù. ´ëÈ­»óÀÚ°¡ Á¾·áµÇ¸é ReadMode ÇÔ¼ö°¡ ÀúÀåÇØ µÎ¾ú´ø ¿ø·¡ ¼³Á¤°ªÀ» º¹±¸ÇÏ¿© ÆíÁý ¸ðµå·Î º¹±¸ÇÑ´Ù. Àб⠸ðµå¿Í °ü·ÃµÈ ¿É¼ÇµéÀº ·¹Áö½ºÆ®¸®¿¡ ÀúÀåµÇ±â´Â ÇÏÁö¸¸ ¼³Á¤ ´ëÈ­»óÀÚ¿¡´Â Æ÷ÇԵǾî ÀÖÁö ¾Ê´Ù. ´ë½Å Àб⠸ðµå ´ëÈ­»óÀÚ¿¡¼­ ½Ç½Ã°£À¸·Î ÀÌ ¿É¼ÇÀ» º¯°æÇϸé ÀÌ °ªÀÌ ±×´ë·Î ¿µ±¸ ÀúÀåµÈ´Ù.

³ª.»óŶõÀÇ ÇÊµå ¸ñ·Ï

»óŶõÀº ÆíÁýÁß¿¡ ´Ã»ó Âü°íÇÒ¸¸ÇÑ À¯¿ëÇÑ Á¤º¸µéÀÌ Ç¥½ÃµÇ¾î ÀÛ¾÷¿¡ ¸¹Àº Æí¸®ÇÔÀ» ÁØ´Ù. ÇÏÁö¸¸ ´ç±ÙÀÇ »óŶõ¿¡ Ç¥½ÃµÇ´Â Á¤º¸´Â ´Ù¾çÇÏÁö ¸øÇÏ¸ç °íÁ¤µÇ¾î ÀÖ¾î »ç¿ëÀÚ°¡ ²À ÇÊ¿ä·Î ÇÏ´Â Á¤º¸¸¦ ¼±ÅÃÀûÀ¸·Î º¸¿©ÁÖÁö´Â ¸øÇÑ´Ù. Ç¥½ÃÇÒ ÇʵåÀÇ ¸ñ·ÏÀ̳ª Ç¥½Ã ¹æ¹ýÀ» º¯°æÇÒ ¼ö ÀÖ´Ù¸é ¿øÇÏ´Â Á¤º¸¸¦ º¸±â ½¬¿î ÇüÅ·ΠÂüÁ¶ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. »óŶõÀÇ ÇÊµå ¸ñ·ÏÀº ÀÏÁ¾ÀÇ ¼³Á¤°ªÀÌ´Ù. Option.h¿¡ ´ÙÀ½ ±¸Á¶Ã¼¸¦ ¼±¾ðÇÏ°í º¯¼ö¸¦ Ãß°¡ÇÑ´Ù.

 

struct SStMask

{

     bool bShow;

     BYTE Order;

     short Width;

     bool bPop;

     BYTE Align;

};

#define STNUM 5

#define STMAX 32

 

struct SOption

{

     int GetStNumByOrder(int Order);

     ....

     SStMask StMask[STMAX];

};

 

SStMask ±¸Á¶Ã¼´Â »óŶõÀÇ Çʵå Çϳª¿¡ ´ëÇÑ Á¤º¸¸¦ °¡Áø´Ù.

 

¸â¹ö

¼³¸í

bShow

º¸ÀÏ °ÍÀΰ¡

Order

ÇʵåÀÇ ¼ø¼­°ª. ÀÛÀ»¼ö·Ï ¿ÞÂÊ¿¡ ³ªÅ¸³­´Ù.

Width

ÆÄÆ®ÀÇ Æø

bPop

ÆÄÆ®ÀÇ ¸ð¾ç. falseÀ̸é À½°¢, trueÀÌ¸é ¾ç°¢

Align

¹®ÀÚ¿­ Á¤·Ä ¹æ½Ä. 0ÀÌ¸é ¿ÞÂÊ, 1À̸é Áß¾Ó, 2ÀÌ¸é ¿À¸¥ÂÊ

 

ÃÖ´ë 32°³ÀÇ Çʵ带 Á¤ÀÇÇÒ ¼ö ÀÖÀ¸¸ç ÇöÀç 5°³ÀÇ Çʵ尡 Á¤ÀǵǾî Àִµ¥ ±âÁ¸ÀÇ ÇÊµå ¸ñ·ÏÀ» ´ÙÀ½°ú °°ÀÌ ÃʱâÈ­ÇÑ´Ù.

 

SStMask StMaskInit[STNUM]={

     {true,0,100,false,0},

     {true,1,120,false,0},

     {true,2,80,false,0},

     {true,3,80,false,0},

     {true,4,80,false,0}

};

 

void SOption::Init()

{

     int i;

     ....

     for (i=0;i<STNUM;i++) {

          StMask[i]=StMaskInit[i];

     }

}

 

int SOption::GetStNumByOrder(int Order)

{

     int i;

     for (i=0;i<STNUM;i++) {

          if (StMask[i].Order==Order) {

              return i;

          }

     }

     return -1;

}

 

GetStNumByOrder´Â ¼ø¼­°ªÀ¸·ÎºÎÅÍ ÇÊµå ¹øÈ£¸¦ ã´Âµ¥ ÀÌ ÇÔ¼ö°¡ Á¶»çÇÑ ÇÊµå ¹øÈ£¸¦ ÷ÀÚ·Î StMask ¹è¿­À» ÂüÁ¶Çϸé ÇʵåÀÇ ¼³Á¤ »óŸ¦ ¾Ë ¼ö ÀÖ´Ù. »óŶõÀÇ ÇÊµå ¼³Á¤°ªÀ» »ç¿ëÀÚ°¡ ¼±ÅÃÇÑ ¿É¼ÇÀ̹ǷΠ¿µ±¸ÀûÀ¸·Î ÀúÀåÇØ¾ß ÇÑ´Ù.

 

void SOption::Load(TCHAR *Key)

{

     ....

     lstrcpy(szKey,Key);

     lstrcat(szKey,"Status");

     for (i=0;i<STNUM;i++) {

          wsprintf(szSub,"Show%d",i);

          StMask[i].bShow=SHRegReadInt(SHCU,szKey,szSub,0)==1 ? true:false;

          wsprintf(szSub,"Order%d",i);

          StMask[i].Order=SHRegReadInt(SHCU,szKey,szSub,0);

          wsprintf(szSub,"Width%d",i);

          StMask[i].Width=SHRegReadInt(SHCU,szKey,szSub,0);

          wsprintf(szSub,"Pop%d",i);

          StMask[i].bPop=SHRegReadInt(SHCU,szKey,szSub,0)==1 ? true:false;

          wsprintf(szSub,"Align%d",i);

          StMask[i].Align=SHRegReadInt(SHCU,szKey,szSub,0);

     }

}

 

void SOption::Save(TCHAR *Key)

{

     ....

 

     lstrcpy(szKey,Key);

     lstrcat(szKey,"Status");

     for (i=0;i<STNUM;i++) {

          wsprintf(szSub,"Show%d",i);

          SHRegWriteInt(SHCU,szKey,szSub,StMask[i].bShow);

          wsprintf(szSub,"Order%d",i);

          SHRegWriteInt(SHCU,szKey,szSub,StMask[i].Order);

          wsprintf(szSub,"Width%d",i);

          SHRegWriteInt(SHCU,szKey,szSub,StMask[i].Width);

          wsprintf(szSub,"Pop%d",i);

          SHRegWriteInt(SHCU,szKey,szSub,StMask[i].bPop);

          wsprintf(szSub,"Align%d",i);

          SHRegWriteInt(SHCU,szKey,szSub,StMask[i].Align);

     }

}

 

¼³Á¤ »óŰ¡ ¸¹±â ¶§¹®¿¡ º°µµÀÇ Å°¿¡ µû·Î ÀúÀåÇÏ¿´´Ù. ÀÌÁ¦ »óŶõÀ» °ü¸®ÇÏ´Â ÇÔ¼öµéÀº Option.StMask ¹è¿­¿¡ ±â·ÏµÈ´ë·Î »óŶõÀ» Ãâ·ÂÇÏ°í °ü¸®ÇØ¾ß ÇÑ´Ù. ToolBar.cppÀÇ »óŶõ °ü·Ã ÇÔ¼ö¸¦ ¼öÁ¤ÇÑ´Ù.

 

void SetStatusPart()

{

     int SBPart[STMAX];

     RECT crt;

     int i,Num,idx;

     int TotalWidth;

 

     GetClientRect(g_hFrameWnd,&crt);

     crt.right-=GetSystemMetrics(SM_CYVSCROLL);

     if (g_ChildNum) {

          // º¸ÀÌ´Â ¸ðµç ÆÄÆ®ÀÇ ÆøÀ» ÇÕÇÔ

          for (i=0,TotalWidth=0;i<STNUM;i++) {

              if (Option.StMask[i].bShow) {

                   TotalWidth+=Option.StMask[i].Width;

              }

          }

          SBPart[0]=max(200,crt.right-TotalWidth);

          for (i=0,Num=0;i<STNUM;i++) {

              if (Option.StMask[i].bShow) {

                   idx=Option.GetStNumByOrder(i);

                   if (idx != -1) {

                        Num++;

                        SBPart[Num]=SBPart[Num-1]+Option.StMask[idx].Width;

                   }

              }

          }

          SendMessage(hStatus, SB_SETPARTS, Num+1, (LPARAM)SBPart);

     } else {

          SBPart[0]=crt.right;

          SendMessage(hStatus, SB_SETPARTS, 1, (LPARAM)SBPart);

     }

}

 

°¢ ÆÄÆ®´Â StMask¿¡ ±â¾ïµÇ¾î ÀÖ´Â ÀÚ½ÅÀÇ ÆøÀ» »ç¿ëÇϸç 0¹ø ÆøÀº ³ª¸ÓÁö¸¦ ÀüºÎ »ç¿ëÇÑ´Ù. »óŶõÀÇ ¿À¸¥ÂÊ¿¡ ÀÖ´Â »çÀÌ¡ ±×¸³ÀÇ ÆøÀº »óŶõÀÇ Æø¿¡¼­ »©¾ß ÇÑ´Ù. ÇʵåÀÇ ¼ø¼­°¡ °íÁ¤µÇ¾î ÀÖÁö ¾Ê±â ¶§¹®¿¡ °¢ Çʵ尡 ¾î¶² ÆÄÆ®¿¡ Ãâ·ÂµÉÁö¸¦ ½Ç½Ã°£À¸·Î °è»êÇÑ´Ù. SetStatusText ÇÔ¼ö´Â ¾Æ¿¹ ±¸Á¶°¡ ¿ÏÀüÈ÷ ¹Ù²ï´Ù.

 

void SetStatusText(int mask,LPCTSTR Mes/*=NULL*/)

{

     TCHAR Text[128];

     HWND hActive;

     SInfo *pSi;

     int byte;

     TCITEM tie;

     int idx;

     int i,stidx,partnum;

     TCHAR AlignText[128];

 

     hActive=(HWND)SendMessage(g_hMDIClient,WM_MDIGETACTIVE,0,NULL);

     if (hActive==NULL) {

          return;

     }

     pSi=(SInfo *)GetWindowLong(hActive,0);

 

     if (mask & 1) {

          if (Mes==NULL) {

              SendMessage(hStatus, SB_SETTEXT, 0, (LPARAM)"´ç±Ù ÆíÁý±âÀÔ´Ï´Ù");

          } else {

              SendMessage(hStatus, SB_SETTEXT, 0, (LPARAM)Mes);

          }

     }

 

     // 0¹ø »óŶõ. stidx=Á¤º¸ ¹øÈ£, bitmask=mask¿¡¼­ ÇØ´ç »óÅÂÀÇ À§Ä¡

     for (stidx=0;stidx<STNUM;stidx++) {

          if (!(mask & (1 << (stidx+1)) && Option.StMask[stidx].bShow)) {

              continue;

          }

          switch (stidx) {

          case 0:

              wsprintf(Text, "%dÁÙ %dÄ­",pSi->Ae.GetInfoFromOff(AE_INFO_PARA)+1,

                   pSi->Ae.GetInfoFromOff(AE_INFO_PARACOL)+1);

              break;

          case 1:

          if (pSi->Ae.GetFormat() != AE_FORMAT_BINARY) {

                   byte=pSi->Ae.GetTextLength();

                   if (byte < 10240) {

                        wsprintf(Text, "ÃÑ %dÁÙ %d ¹ÙÀÌÆ®",

                            pSi->Ae.GetDocInfo(AE_DOC_TOTALPARA)+1,byte);

                   } else {

                        wsprintf(Text, "ÃÑ %dÁÙ %d K¹ÙÀÌÆ®",

                            pSi->Ae.GetDocInfo(AE_DOC_TOTALPARA)+1,byte/1024);

                   }

              } else {

                   wsprintf(Text, "ÃÑ %dÁÙ",pSi->Ae.GetDocInfo(AE_DOC_TOTALPARA)+1);

              }

              break;

          case 2:

              tie.mask=TCIF_IMAGE;

              if (pSi->Ae.GetModified()) {

                   lstrcpy(Text,"ÆíÁýµÇ¾úÀ½");

                   tie.iImage=1;

              } else {

                   lstrcpy(Text,"¹ÌÆíÁý");

                   tie.iImage=0;

              }

              idx=FindFileTab(pSi->NowFile);

              if (idx!=-1) {

                   TabCtrl_SetItem(hFileTab,idx,&tie);

              }

              break;

          case 3:

              switch (pSi->Ae.GetFormat()) {

              case AE_FORMAT_WIN:

                   lstrcpy(Text,"WIN Æ÷¸Ë");

                   break;

              case AE_FORMAT_UNIX:

                   lstrcpy(Text,"UNIX Æ÷¸Ë");

                   break;

              case AE_FORMAT_MAC:

                   lstrcpy(Text,"MAC Æ÷¸Ë");

                   break;

              case AE_FORMAT_UNICODE:

                   lstrcpy(Text,"UNICODE");

                   break;

               case AE_FORMAT_UNIBIG:

                    lstrcpy(Text,"UNICODE(Big Endian)");

                    break;

               case AE_FORMAT_UTF8:

                    lstrcpy(Text,"UTF-8");

                    break;

              case AE_FORMAT_BINARY:

                   lstrcpy(Text,"ÀÌÁø ÆÄÀÏ");

                   break;

              }

              break;

          case 4:

              if (pSi->Ae.GetInsMode()) {

                   lstrcpy(Text,"°ãħ¸ðµå");

              } else {

                   lstrcpy(Text,"»ðÀÔ¸ðµå");

              }

              break;

          }

 

          switch (Option.StMask[stidx].Align) {

          case 0:

              lstrcpy(AlignText,"");

              break;

          case 1:

              lstrcpy(AlignText,"\t");

              break;

          case 2:

              lstrcpy(AlignText,"\t\t");

              break;

          }

          lstrcat(AlignText,Text);

 

          for (i=0,partnum=1;i<STNUM;i++) {

              if (Option.StMask[i].bShow && Option.StMask[stidx].Order > Option.StMask[i].Order)

                   partnum++;

          }

          SendMessage(hStatus, SB_SETTEXT, partnum |

              (Option.StMask[stidx].bPop ? SBT_POPOUT:0), (LPARAM)AlignText);

     }

}

 

ÇʵåÀÇ °³¼ö³ª ¼ø¼­ µîÀÌ ¾î¶»°Ô µÉÁö ÀüÇô ¿¹ÃøÇÒ ¼ö ¾øÀ¸¹Ç·Î ¸ðµç Çʵ忡 ´ëÇØ ·çÇÁ¸¦ µ¹¸é¼­ Ç¥½ÃµÇ¾î ÀÖ´Â Çʵ常 Ãâ·ÂÇÑ´Ù. À½°¢, ¾ç°¢ÀÇ ¸ð¾ç°ú Á¤·Ä ¿É¼Çµµ Àû¿ëÇÑ´Ù. ¿©±â±îÁö ÀÛ¾÷ÇÑ ÈÄ ½ÇÇàÇϸé ÀÌÀüÀÇ »óŶõ°ú ¿ÏÀüÈ÷ °°Àº ¸ð¾çÀÇ »óŶõÀÌ º¸ÀÏ °ÍÀÌ´Ù. ÇÏÁö¸¸ Áö±ÝºÎÅÍ´Â ¼³Á¤ ´ëÈ­»óÀÚ¸¦ ÅëÇØ »óŶõÀ» ÀÔ¸À´ë·Î ¶â¾î °íÄ¥ ¼ö ÀÖ´Ù. Config.cppÀÇ ´ÙÀ½ ÇÔ¼ö¸¦ ¿ÏÀüÈ÷ ´Ù½Ã ÀÛ¼ºÇÑ´Ù.

 

BOOL CALLBACK ToolBarDlgProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam)

{

     static HWND hListSt;

     static int oldidx;

     LVCOLUMN COL;

     LVITEM LI;

     int i,idx;

     TCHAR szTemp[32];

     static TCHAR *arStName[]={"ÇöÀç À§Ä¡","¹®¼­ Å©±â","ÆíÁý ¿©ºÎ","ÆÄÀÏ Æ÷¸Ë","»ðÀÔ ¸ðµå"};

     TCHAR tName[64],tShow,tCol[4][12];

 

     switch(iMessage) {

     case WM_INITDIALOG:

          hListSt=GetDlgItem(hDlg,IDC_LISTSTATUS);

          COL.mask=LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;

          COL.fmt=LVCFMT_LEFT;

          COL.cx=150;

          COL.pszText="Á¤º¸";

          COL.iSubItem=0;

          ListView_InsertColumn(hListSt,0,&COL);

 

          COL.cx=50;

          COL.pszText="Æø";

          COL.iSubItem=1;

          ListView_InsertColumn(hListSt,1,&COL);

 

          COL.cx=60;

          COL.pszText="Á¤·Ä";

          COL.iSubItem=1;

          ListView_InsertColumn(hListSt,2,&COL);

 

          COL.cx=50;

          COL.pszText="¸ð¾ç";

          COL.iSubItem=3;

          ListView_InsertColumn(hListSt,3,&COL);

          ListView_SetExtendedListViewStyle(hListSt, LVS_EX_FULLROWSELECT | LVS_EX_CHECKBOXES);

          SendDlgItemMessage(hDlg,IDC_SLIDERSTWIDTH,TBM_SETRANGE,FALSE,MAKELPARAM(40,200));

          return TRUE;

     case WM_COMMAND:

          switch (LOWORD(wParam)) {

          case IDC_TOOLBARBIG:

          case IDC_TOOLBARTEXT:

              PropSheet_Changed(GetParent(hDlg),hDlg);

              return TRUE;

          case IDC_BTNSTUP:

          case IDC_BTNSTDOWN:

              idx=ListView_GetNextItem(hListSt,-1,LVNI_ALL | LVNI_SELECTED);

              if (idx==-1 || (LOWORD(wParam)==IDC_BTNSTDOWN && idx >= STNUM-1) ||

                   (LOWORD(wParam)==IDC_BTNSTUP && idx == 0)) {

                   return TRUE;

              }

              LI.mask=LVIF_TEXT;

              LI.iItem=idx;

              LI.iSubItem=0;

              LI.pszText=tName;

              LI.cchTextMax=64;

              ListView_GetItem(hListSt,&LI);

              tShow=ListView_GetCheckState(hListSt,idx);

              for (i=1;i<=3;i++) {

                   ListView_GetItemText(hListSt,idx,i,tCol[i],16);

              }

 

              ListView_DeleteItem(hListSt,idx);

              if (LOWORD(wParam)==IDC_BTNSTUP) {

                   idx--;

              } else {

                   idx++;

              }

              LI.iItem=idx;

              ListView_InsertItem(hListSt,&LI);

              ListView_SetItemState(hListSt,idx,INDEXTOSTATEIMAGEMASK(

                   (tShow)?2:1),LVIS_STATEIMAGEMASK);

              for (i=1;i<=3;i++) {

                   ListView_SetItemText(hListSt,idx,i,tCol[i]);

              }

              ListView_SetItemState(hListSt,idx,

                   LVIS_SELECTED | LVIS_FOCUSED,LVIS_SELECTED | LVIS_FOCUSED);

              PropSheet_Changed(GetParent(hDlg),hDlg);

              return TRUE;

          case IDC_RASTLEFT:

              idx=ListView_GetNextItem(hListSt,-1,LVNI_ALL | LVNI_SELECTED);

              ListView_SetItemText(hListSt,idx,2,"¿ÞÂÊ");

              PropSheet_Changed(GetParent(hDlg),hDlg);

              return TRUE;

          case IDC_RASTCENTER:

              idx=ListView_GetNextItem(hListSt,-1,LVNI_ALL | LVNI_SELECTED);

              ListView_SetItemText(hListSt,idx,2,"Áß¾Ó");

              PropSheet_Changed(GetParent(hDlg),hDlg);

              return TRUE;

          case IDC_RASTRIGHT:

              idx=ListView_GetNextItem(hListSt,-1,LVNI_ALL | LVNI_SELECTED);

              ListView_SetItemText(hListSt,idx,2,"¿À¸¥ÂÊ");

              PropSheet_Changed(GetParent(hDlg),hDlg);

              return TRUE;

          case IDC_CHKPOPOUT:

              idx=ListView_GetNextItem(hListSt,-1,LVNI_ALL | LVNI_SELECTED);

              ListView_SetItemText(hListSt,idx,3,IsDlgButtonChecked(hDlg,IDC_CHKPOPOUT)

                   ? "¾ç°¢":"À½°¢");

              PropSheet_Changed(GetParent(hDlg),hDlg);

              return TRUE;

          }

          break;

     case WM_HSCROLL:

          if ((HWND)lParam == GetDlgItem(hDlg,IDC_SLIDERSTWIDTH)) {

              idx=ListView_GetNextItem(hListSt,-1,LVNI_ALL | LVNI_SELECTED);

              wsprintf(szTemp,"%d",SendMessage(GetDlgItem(hDlg,IDC_SLIDERSTWIDTH),TBM_GETPOS,0,0));

              ListView_SetItemText(hListSt,idx,1,szTemp);

              PropSheet_Changed(GetParent(hDlg),hDlg);

          }

          return TRUE;

     case WM_NOTIFY:

          LPNMHDR hdr;

          LPNMLISTVIEW nlv;

          hdr=(LPNMHDR)lParam;

          nlv=(LPNMLISTVIEW)lParam;

 

          if (hdr->hwndFrom == hListSt) {

              switch (hdr->code) {

              case LVN_ITEMCHANGED:

                   if (nlv->uChanged == LVIF_STATE && nlv->uNewState == (LVIS_SELECTED | LVIS_FOCUSED)) {

                        oldidx=nlv->iItem;

                        ListView_GetItemText(hListSt,nlv->iItem,1,szTemp,32);

                        SendDlgItemMessage(hDlg,IDC_SLIDERSTWIDTH,TBM_SETPOS,TRUE,atoi(szTemp));

                        ListView_GetItemText(hListSt,nlv->iItem,2,szTemp,32);

                        if (lstrcmp(szTemp,"¿ÞÂÊ")==0) {

                            CheckRadioButton(hDlg,IDC_RASTLEFT,IDC_RASTRIGHT,IDC_RASTLEFT);

                        } else if (lstrcmp(szTemp,"Áß¾Ó")==0) {

                            CheckRadioButton(hDlg,IDC_RASTLEFT,IDC_RASTRIGHT,IDC_RASTCENTER);

                        } else {

                            CheckRadioButton(hDlg,IDC_RASTLEFT,IDC_RASTRIGHT,IDC_RASTRIGHT);

                        }

                        ListView_GetItemText(hListSt,nlv->iItem,3,szTemp,32);

                        CheckDlgButton(hDlg,IDC_CHKPOPOUT,lstrcmp(szTemp,"¾ç°¢")==0);

                   }

                   // üũ ¹Ú½º Ŭ¸¯½Ã. ÄÚµå º¯°æ½Ã´Â ¸·¾Æ¾ß ÇÔ

                   if (nlv->uChanged == LVIF_STATE && (nlv->uNewState & LVIS_STATEIMAGEMASK) !=

                        (nlv->uOldState & LVIS_STATEIMAGEMASK)) {

                        if (!bEditByCode) {

                            PropSheet_Changed(GetParent(hDlg),hDlg);

                        }

                   }

                   break;

              }

              return TRUE;

          }

 

          switch (hdr->code) {

          case PSN_SETACTIVE:

              g_StartPage=3;

              CheckDlgButton(hDlg,IDC_TOOLBARBIG,NewOption.bToolBarBig);

              CheckDlgButton(hDlg,IDC_TOOLBARTEXT,NewOption.bToolBarText);

              ListView_DeleteAllItems(hListSt);

              bEditByCode=TRUE;

              for (i=0;i<STNUM;i++) {

                   idx=NewOption.GetStNumByOrder(i);

                   LI.mask=LVIF_TEXT;

                   LI.iItem=i;

                   LI.iSubItem=0;

                   LI.pszText=arStName[idx];

                   ListView_InsertItem(hListSt,&LI);

 

                   ListView_SetItemState(hListSt,i,INDEXTOSTATEIMAGEMASK(

                        (NewOption.StMask[idx].bShow)?2:1),LVIS_STATEIMAGEMASK);

 

                   wsprintf(szTemp,"%d",NewOption.StMask[idx].Width);

                   ListView_SetItemText(hListSt,i,1,szTemp);

 

                   switch (NewOption.StMask[idx].Align) {

                   case 0:

                        lstrcpy(szTemp,"¿ÞÂÊ");

                        break;

                   case 1:

                        lstrcpy(szTemp,"Áß¾Ó");

                        break;

                   case 2:

                        lstrcpy(szTemp,"¿À¸¥ÂÊ");

                        break;

                   }

                   ListView_SetItemText(hListSt,i,2,szTemp);

 

                   if (NewOption.StMask[idx].bPop) {

                        ListView_SetItemText(hListSt,i,3,"¾ç°¢");

                   } else {

                        ListView_SetItemText(hListSt,i,3,"À½°¢");

                   }

                   // ¸¶Áö¸· ¼±ÅÃÇß´ø Ç׸ñÀ» ´Ù½Ã ¼±ÅÃÇÑ´Ù. ±×·¸Áö ¾ÊÀ¸¸é Àû¿ë½Ã Ç×»ó ù Ç׸ñÀÌ ¼±ÅÃµÇ¾î ºÒÆíÇÏ´Ù.

                   ListView_SetItemState(hListSt,oldidx,

                        LVIS_SELECTED | LVIS_FOCUSED,LVIS_SELECTED | LVIS_FOCUSED);

                    ListView_EnsureVisible(hListSt,oldidx,FALSE);

              }

              bEditByCode=FALSE;

              return TRUE;

          case PSN_APPLY:

              ApplyNow();

              return TRUE;

          case PSN_KILLACTIVE:

              NewOption.bToolBarBig=IsDlgButtonChecked(hDlg,IDC_TOOLBARBIG);

              NewOption.bToolBarText=IsDlgButtonChecked(hDlg,IDC_TOOLBARTEXT);

              for (i=0;i<STNUM;i++) {

                   ListView_GetItemText(hListSt,i,0,szTemp,32);

                   for (idx=0;idx<STNUM;idx++) {

                        if (lstrcmp(szTemp,arStName[idx])==0)

                            break;

                   }

                   NewOption.StMask[idx].bShow=(ListView_GetCheckState(hListSt,i) ? true:false);

                   NewOption.StMask[idx].Order=i;

                   ListView_GetItemText(hListSt,i,1,szTemp,32);

                   NewOption.StMask[idx].Width=atoi(szTemp);

                   ListView_GetItemText(hListSt,i,2,szTemp,32);

                   if (lstrcmp(szTemp,"¿ÞÂÊ")==0) {

                       NewOption.StMask[idx].Align=0;

                   } else if (lstrcmp(szTemp,"Áß¾Ó")==0) {

                        NewOption.StMask[idx].Align=1;

                   } else {

                        NewOption.StMask[idx].Align=2;

                   }

                   ListView_GetItemText(hListSt,i,3,szTemp,32);

                   NewOption.StMask[idx].bPop=(lstrcmp(szTemp,"¾ç°¢")==0);

              }

              return TRUE;

          }

          break;

     }

     return FALSE;

}

 

ÀÌ ´ëÈ­»óÀÚ¸¦ ÅëÇØ ÇöÀç »óŶõÀÇ ±¸Á¶¸¦ º¸¿© ÁÖ°í ¼öÁ¤ÇÒ ¼ö ÀÖ´Ù. Äڵ尡 ±²ÀåÈ÷ ±æ±â´Â Çѵ¥ StMask ¹è¿­ÀÇ ¿©·¯ ¸â¹ö°ªÀ» Á¶ÀÛÇÏ´Â ÀϹÝÀûÀÎ ÄÚµåÀ̹ǷΠµû·Î ºÐ¼®ÀÌ ÇÊ¿äÇÑ Á¤µµ´Â ¾Æ´Ï´Ù. ApplyNow¿¡ Àû¿ë Äڵ带 ÀÛ¼ºÇÑ´Ù.

 

void ApplyNow()

{

     BOOL bChangeStatus=FALSE;

     ....

     if (memcmp(Option.StMask,NewOption.StMask,sizeof(SStMask)*STMAX)!=0) {

          bChangeStatus=TRUE;

     }

     ....

     Option=NewOption;

     if (bRelayout) {

          Relayout();

     }

     if (bChangeStatus) {

          SetStatusPart();

          SetStatusText(0xffff);

     }

}

 

»óŶõÀÇ Á¤º¸´Â °Å´ëÇÑ ±¸Á¶Ã¼ ¹è¿­·Î °ü¸®µÇ´Âµ¥ ¸ðµç ¸â¹öÀÇ º¯°æ ¿©ºÎ¸¦ ÀÏÀÏÀÌ Á¡°ËÇÏ´Â °ÍÀº ³Ê¹« ºñÈ¿À²ÀûÀÌ´Ù. ±×·¡¼­ StMask ¹è¿­ Àüü¸¦ ¸Þ¸ð¸® ºñ±³ÇÏ¿© Á¶±ÝÀÌ¶óµµ º¯°æµÇ¾úÀ¸¸é »óŶõÀ» ¿ÏÀüÈ÷ ´Ù½Ã °»½ÅÇÑ´Ù. ÀÌÁ¦ ÀÌ ´ëÈ­»óÀÚ¸¦ ÅëÇØ Ç¥½ÃÇÒ Çʵ带 ¼±ÅÃÇϰųª ¼ø¼­¸¦ ¹Ù²Ü ¼öµµ ÀÖ°í °¢ ÇʵåÀÇ Æø, Á¤·Ä ¹æ½ÄÀ» ¿øÇϴ´ë·Î ÁöÁ¤ÇÒ ¼öµµ ÀÖ´Ù. ÀÌ·± ±¸Á¶¸¦ ¸¸µé¾úÀ¸¸é »óŸ¦ Çʵ带 ´Ã¸®´Â °Íµµ ¾ÆÁÖ ½±´Ù. StMask ¹è¿­¿¡ Çʵ带 ´õ Ãß°¡Çϱ⸸ ÇÏ¸é µÈ´Ù.

 

Çʵå

¼³¸í

´ë¼Ò¹®ÀÚ ÀÔ·Â ¸ðµå

Caps Lock ŰÀÇ »óÅÂ

ÇÑ±Û ÀÔ·Â ¸ðµå

ÇÑ±Û ¶Ç´Â ¿µ¹®

¹®ÀÚ ÄÚµå

ij·µ À§Ä¡ÀÇ ¹®ÀÚ ÄÚµå

¼±Åÿµ¿ª Á¤º¸

¼±Åà ¿µ¿ªÀÇ ±æÀÌ

Ŭ¸³º¸µåÀÇ ³»¿ë

Æ÷¸Ë ¹× ³»¿ë

Àбâ Àü¿ë ¿©ºÎ

Àбâ Àü¿ë ¿©ºÎ

ÇöÀç ½Ã°£

ÇöÀç ½Ã°£. n½Ã:nºÐ Æ÷¸ËÀ¸·Î º¸¿© ÁÖ¸ç ÃÊ´Â »ý·«ÇÑ´Ù.

ÇöÀç ³¯Â¥

ÇöÀç ³¯Â¥. n¿ù-nÀÏ(¿äÀÏ) Æ÷¸Ë

 

ÆíÁý¿¡ µµ¿òÀÌ µÉ¸¸ÇÑ Á¤º¸µéÀ» ´õ Ãß°¡ÇØ º¸¾Ò´Ù. Option.hÀÇ ÇÊµå °³¼ö¸¦ 13°³·Î ´Ã¸°´Ù.

 

#define STNUM 13

 

Option.cppÀÇ StMaskInit ±¸Á¶Ã¼ÀÇ ÃʱⰪµµ À§ µµÇ¥´ë·Î Ãß°¡ ÀÛ¼ºÇß´Ù.

 

SStMask StMaskInit[STNUM]={

     {true,0,100,false,0},

     {true,1,120,false,0},

     {true,2,80,false,0},

     {true,3,80,false,0},

     {true,4,80,false,0},

     {false,5,50,false,0},

     {false,6,40,false,0},

     {false,7,80,false,0},

     {false,8,80,false,0},

     {false,9,120,false,0},

     {false,10,65,false,0},

     {false,11,70,false,0},

     {false,12,90,false,0}

};

 

Ãß°¡µÈ Çʵå´Â ÀÏ´Ü ¸ðµÎ ¼û°Ü ³õ¾Ò´Âµ¥ ÇÊ¿äÇϸé Ç¥½ÃÇÒ ¼ö ÀÖ´Ù. ³Ê¹« ¸¹Àº Á¤º¸¸¦ ÇѲ¨¹ø¿¡ º¸¿©ÁÖ´Â °Íº¸´Ù´Â ´çÀå ²À ÇÊ¿äÇÑ ¿É¼Ç¸¸ °£°áÇÏ°Ô Ç¥½ÃÇÏ´Â °ÍÀÌ ´õ ±ò²ûÇÏ´Ù. ¼³Á¤ ´ëÈ­»óÀÚ¿¡´Â Çʵå À̸§¸¸ ´Ã¸®¸é µÈ´Ù.

 

BOOL CALLBACK ToolBarDlgProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam)

{

     ....

     static TCHAR *arStName[]={"ÇöÀç À§Ä¡","¹®¼­ Å©±â","ÆíÁý ¿©ºÎ","ÆÄÀÏ Æ÷¸Ë","»ðÀÔ ¸ðµå",

     "´ë¼Ò¹®ÀÚ ÀÔ·Â ¸ðµå","ÇÑ±Û ÀÔ·Â ¸ðµå","¹®ÀÚ ÄÚµå","¼±Åÿµ¿ª Á¤º¸","Ŭ¸³º¸µåÀÇ ³»¿ë","Àбâ Àü¿ë ¿©ºÎ",

     "ÇöÀç ½Ã°£","ÇöÀç ³¯Â¥"};

 

´ÙÀ½Àº Ãß°¡µÈ ÇʵåÀÇ Á¤º¸¸¦ Á¶»çÇÏ´Â Äڵ带 ÀÛ¼ºÇÑ´Ù. ÇÑ±Û ÀÔ·Â ¸ðµå Á¶»ç¸¦ À§ÇØ Util.cpp¿¡ ´ÙÀ½ ÇÔ¼ö¸¦ Ãß°¡ÇÑ´Ù.

 

BOOL MyGetImeMode(HWND hEdit)

{

     HIMC hImc;

     DWORD Con, Sen;

 

     hImc=ImmGetContext(hEdit);

     ImmGetConversionStatus(hImc,&Con,&Sen);

     ImmReleaseContext(hEdit,hImc );

     if (Con & IME_CMODE_NATIVE) {

          return TRUE;

     } else {

          return FALSE;

     }

}

 

SetStatusText¿¡ case¸¦ ´Ã·Á »õ·Î Á¤ÀÇÇÑ ÇʵåÀÇ Á¤º¸¸¦ »óŶõ¿¡ Ãâ·ÂÇÑ´Ù.

 

void SetStatusText(int mask,LPCTSTR Mes/*=NULL*/)

{

     ....

     SYSTEMTIME st;

     static TCHAR *arYoil[]={"ÀÏ","¿ù","È­","¼ö","¸ñ","±Ý","Åä","ÀÏ"};

     int s,e;

     HGLOBAL hmem;

     TCHAR *ptr;

     ....

     for (stidx=0;stidx<STNUM;stidx++) {

          if (!(mask & (1 << (stidx+1)) && Option.StMask[stidx].bShow)) {

              continue;

          }

          switch (stidx) {

          ....

          case 5:

              if ((GetKeyState(VK_CAPITAL) & 0x1) != 0) {

                   lstrcpy(Text,"´ë¹®ÀÚ");

              } else {

                   lstrcpy(Text,"¼Ò¹®ÀÚ");

              }

              break;

          case 6:

              if (MyGetImeMode(pSi->Ae.hWnd)) {

                   lstrcpy(Text,"ÇѱÛ");

              } else {

                   lstrcpy(Text,"¿µ¹®");

              }

              break;

          case 7:

              s=pSi->Ae.GetOffset();

              pSi->Ae.GetText(AlignText,10,s,s+2);

              if (IsDBCSLeadByte(AlignText[0])) {

                   e=*(WORD *)AlignText;

              } else {

                   e=*(BYTE *)AlignText;

              }

              wsprintf(Text,"%d(%x)",e,e);

              break;

          case 8:

              pSi->Ae.GetSelect(s,e);

              if (s==e) {

                   lstrcpy(Text,"¼±ÅþøÀ½");

              } else {

                   wsprintf(Text,"±æÀÌ:%d",e-s);

              }

              break;

          case 9:

              if (IsClipboardFormatAvailable(CF_TEXT)) {

                   OpenClipboard(g_hFrameWnd);

                   hmem=GetClipboardData(CF_TEXT);

                   ptr=(TCHAR *)GlobalLock(hmem);

                   lstrcpyn(Text,ptr,64);

                   ReplaceCtrlString(Text,lstrlen(Text),NULL,0);

                   GlobalUnlock(hmem);

                   CloseClipboard();

              } else {

                   lstrcpy(Text,"ºñ¾îÀÖÀ½");

              }

              break;

          case 10:

              if (pSi->Ae.GetReadOnly()) {

                   lstrcpy(Text,"ÀбâÀü¿ë");

              } else {

                   lstrcpy(Text,"¾²±â°¡´É");

              }

              break;

          case 11:

              GetLocalTime(&st);

              wsprintf(Text,"%d½Ã %dºÐ",st.wHour,st.wMinute);

              break;

          case 12:

              GetLocalTime(&st);

              wsprintf(Text,"%d¿ù %dÀÏ(%s)",st.wMonth,st.wDay, arYoil[st.wDayOfWeek]);

              break;

          }

 

Űº¸µå »óųª Ŭ¸³º¸µå »óÅ´ Áï½Ã Á¶»çÇÒ ¼ö ÀÖÀ¸¹Ç·Î Á¶»çµÈ °á°ú¸¦ ¹®ÀÚ¿­·Î º¯°æÇÏ¿© Çʵ忡 Ãâ·ÂÇÑ´Ù. ÀϺΠÇʵå´Â ÁÖ±âÀûÀ¸·Î °»½ÅµÇ¾î¾ß ÇÑ´Ù. ¹®ÀÚ ÄÚµå¿Í ¼±Åÿµ¿ª Á¤º¸´Â ij·µÀÌ ¿òÁúÀÏ ¶§ÀÎ AEN_MOVE¿¡¼­ °°ÀÌ °»½ÅÇÑ´Ù.

 

LRESULT CALLBACK DGChildProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)

{

     ....

     case WM_COMMAND:

          switch (LOWORD(wParam)) {

          case 1:

              switch (HIWORD(wParam)) {

              case AEN_MOVE:

               SetStatusText(0x302);

                   break;

 

SetStatusTextÀÇ ¿ø·¡ Àμö´Â ÇöÀç ij·µ À§Ä¡¸¦ ÀǹÌÇÏ´Â 0x2¿´´Ù. ¹®ÀÚ ÄÚµå´Â 7¹ø Çʵå, ¼±Åÿµ¿ª Á¤º¸´Â 8¹ø Çʵå, ±×·¡¼­ ´ëÀÀµÇ´Â ¸¶½ºÅ©°ªÀº 1 << (7+1), 1 << (8+1)ÀÌ µÇ¸ç ÀÌ µÎ °ª°ú ±âÁ¸ÀÇ 0x2¸¦ ORÇϸé 0x302°¡ µÈ´Ù. ÇÑ±Û ÀÔ·Â ¸ðµå, ´ë¼Ò¹®ÀÚ, Ŭ¸³º¸µå »óÅÂ, Àбâ Àü¿ëÀº ¾ðÁ¦µçÁî º¯°æµÉ ¼ö ÀÖÀ¸¹Ç·Î OnIdle¿¡¼­ ÁÖ±âÀûÀ¸·Î °»½ÅÇÑ´Ù.

 

void OnIdle()

{

     ....

     if (hActive) {

          ....

        SetStatusText(0xcc0);

     } else {

          ....

 

½Ã°£°ú ³¯Â¥´Â ÁÖ±âÀûÀ¸·Î ¹Ù²î¹Ç·Î OnTimer¿¡¼­ °»½ÅÇÑ´Ù. 3ÃÊ °£°ÝÀÇ Å¸À̸Ӹ¦ ¼³Ä¡Çϰí ÀÌ Å¸À̸ӿ¡¼­ »óŶõÀ» °»½ÅÇÏ¸é µÈ´Ù.

 

int OnCreate(HWND hWnd,WPARAM wParam,LPARAM lParam)

{

     ....

     SetTimer(hWnd,100,1,NULL);

    SetTimer(hWnd,3,3000,NULL);

     return 0;

}

 

void OnTimer(HWND hWnd,WPARAM wParam,LPARAM lParam)

{

     switch (wParam) {

     ....

     case 3:

          SetStatusText(0x3000);

          break;

 

½Ã°£Àº ÃÊ´ÜÀ§·Î ¹Ù²îÁö¸¸ »óŶõÀÇ ½Ã°£ Á¤º¸°¡ ÃÊ´ÜÀ§±îÁö Á¤È®ÇÒ ÇÊ¿ä´Â ¾ø°í ¾îÂ÷ÇÇ ºÐ´ÜÀ§±îÁö¸¸ Ç¥½ÃµÇ¹Ç·Î ´ëÃæ Àû´çÇÑ ½Ã°£ °£°ÝÀ» ¼³Á¤Çß´Ù. »óŶõ ¼³Á¤ ´ëÈ­»óÀÚÀÇ ½ÇÇà ¸ð½ÀÀº ´ÙÀ½°ú °°´Ù.

¸®½ºÆ® ºäÀÇ Ã¼Å© ¹Ú½º·Î Ç¥½ÃÇÒ ¸ñ·ÏÀ» ¼±ÅÃÇÏ°í ¿À¸¥ÂÊÀÇ ÄÁÆ®·Ñ·Î ÇʵåÀÇ ¼ø¼­¿Í Æø, Á¤·Ä»óÅÂ, Àå½ÄÀ» ¼±ÅÃÇÑ´Ù. ³»ºÎ ±¸Á¶´Â º¹ÀâÇÏÁö¸¸ »ç¿ëÀÚ°¡ ÀÌ ¿É¼ÇÀ» Á¶Á¤Çϱâ´Â ¾î·ÆÁö ¾ÊÀ» °ÍÀÌ´Ù. ´ÙÀ½Àº ¸ðµç »óŶõÀ» ´Ù Ãâ·ÂÇØ º» °ÍÀÌ´Ù.

Ç¥½ÃÇÒ Á¤º¸°¡ ¿ö³« ¸¹±â ¶§¹®¿¡ À©µµ¿ì Å©±â¸¦ ÃæºÐÈ÷ Å©°Ô ÇØ¾ß ¸ðµç Á¤º¸¸¦ ´Ù º¼ ¼ö ÀÖ´Ù. ¹°·Ð ÀÌ·¸°Ô ¸¹Àº Á¤º¸¸¦ ÇѲ¨¹ø¿¡ ´Ù Ç¥½ÃÇØ ³õ°í »ç¿ëÇÒ »ç¶÷Àº ¸¹Áö ¾ÊÀ» °ÍÀÌ´Ù. ²À ÇÊ¿äÇÑ Á¤º¸¸¸ ¿øÇÏ´Â ÇüÅ·Πǥ½ÃÇÏ´Â °ÍÀÌ È¿À²ÀûÀÌ´Ù.

´Ù.È£½ºÆ®ÀÇ ÆË¾÷ µî·Ï

ÄÁÆ®·ÑÀÇ ÆË¾÷ ¸Þ´º´Â ¾ðÁ¦µçÁö ¸¶¿ì½º ¿À¸¥ÂÊ ¹öư¸¸ ´©¸£¸é ³ªÅ¸³ª¹Ç·Î »ç¿ëÀÚ°¡ °¡Àå Á¢±ÙÇϱ⠽¬¿î ÀåÄ¡ÀÌ´Ù. ÇöÀç Ŭ¸³º¸µå °ü·Ã ¸í·É¸¸ µé¾îÀÖ°í ¹®¼­¸¦ °ü¸®Çϰųª ÄÁÆ®·Ñ ÀÚü¸¦ °ü¸®ÇÏ´Â ¸í·ÉÀº µé¾î ÀÖÁö ¾Ê´Ù. ¿Ö³ÄÇÏ¸é ÆË¾÷ ¸Þ´ºÀÇ ¸í·ÉÀ» ó¸®ÇÏ´Â ÄÁÆ®·ÑÀÌ ½º½º·Î¸¦ Á¦¾îÇÒ ¼ö ¾ø±â ¶§¹®ÀÌ´Ù. ½ÇÁ¦·Î´Â ÀÌ·± ¸í·ÉµéÀÌ ÄÁÆ®·ÑÀÇ ÆË¾÷ ¸Þ´º¿¡ µé¾î °¥ ¼ö ÀÖ¾î¾ß ÇÑ´Ù. ¹®Á¦´Â ÄÁÆ®·ÑÀº È£½ºÆ®¿Í´Â ¿ÏÀüÈ÷ µ¶¸³ÀûÀ̶ó´Â Á¡ÀÌ´Ù.

È£½ºÆ®ÀÇ ¸Þ´º Ç׸ñµµ ÄÁÆ®·Ñ¿¡ Ãß°¡ÇÒ ¼ö ÀÖµµ·Ï ÇØ º¸ÀÚ. ÄÁÆ®·ÑÀÌ ÆË¾÷ ¸Þ´º¸¦ Ãâ·ÂÇÒ ¶§ È£½ºÆ®¿¡°Ô ÆË¾÷ ¸Þ´º¿¡ ´ëÇÑ Á¦¾î±ÇÀ» Àá½Ã ¾çº¸ÇÏ¿© È£½ºÆ®°¡ ¿©ºÐÀÇ ¸Þ´º Ç׸ñÀ» ´õ Ãß°¡ÇÒ ¼ö ÀÖµµ·Ï Çϰí ÀÌ ¸Þ´º°¡ ¼±ÅõǸé È£½ºÆ®¿¡°Ô ½ÅÈ£¸¸ º¸³»¸é µÈ´Ù.

 

void CApiEditText::OnContextMenu(HWND hWnd, HWND hwndContext, UINT xPos, UINT yPos)

{

     ....

     AppendMenu(hPopup,MF_STRING,IDM_AE_PASTE,"ºÙ¿©³Ö±â(&P)");

     AppendMenu(hPopup,MF_STRING,IDM_AE_SELALL,"¸ðµÎ¼±ÅÃ(&A)");

    SendMessage(GetParent(pFrame->hWnd),pFrame->UserBase+4,(WPARAM)hPopup,0);

     ....

 

ÀÚ½ÅÀÇ ¸Þ´º Ç׸ñÀ» ¸ÕÀú Ãß°¡ÇÑ ÈÄ È£½ºÆ®¿¡°Ô UserBase+4 ¸Þ½ÃÁö¸¦ º¸³» À©µµ¿ì ÇÚµéÀ» ³Ñ±ä´Ù. È£½ºÆ®°¡ ÀÌ ¸Þ½ÃÁö¿¡ ¹ÝÀÀÇÏÁö ¾ÊÀ¸¸é ¾Æ¹« Àϵµ ÀϾÁö ¾Ê´Â´Ù. ¸Þ½ÃÁö´Â ó¸®ÇÏÁö ¾Ê´õ¶óµµ µðÆúÆ® 󸮵ȴٴ Á¡¿¡¼­ ÇÔ¼öº¸´Ù À¯¿¬ÇÑ´Ù. È£½ºÆ®´Â ÀÌ ¸Þ½ÃÁö¸¦ ¹Þ¾ÒÀ» ¶§ hPopup¿¡ ´Ù¸¥ Ç׸ñÀ» Ãß°¡ÇÒ ±âȸ¸¦ °¡Áø´Ù. ÀÌ·¸°Ô Ãß°¡µÈ Ç׸ñÀÌ ¼±ÅÃµÇ¸é ´Ù½Ã È£½ºÆ®¿¡°Ô ½ÅÈ£¸¦ º¸³½´Ù.

 

void CApiEditText::OnCommand(HWND hWnd, int id, HWND hwndCtl, UINT codeNotify)

{

     switch (id) {

     ....

     default:

          SendMessage(GetParent(pFrame->hWnd),pFrame->UserBase+5,id,0);

          return;

     }

}

 

UserBase+5 ¸Þ½ÃÁö¸¦ º¸³» ¼±ÅÃµÈ Ç׸ñÀÇ ID¸¸ ¾Ë·Á ÁÖ¸é ÀÌ Ç׸ñ¿¡ ´ëÇÑ Ã³¸®´Â È£½ºÆ®°¡ ¾Ë¾Æ¼­ ÇÒ °ÍÀÌ´Ù. ´ç±ÙÀÇ °æ¿ì º°·Î Ãß°¡ÇÒ¸¸ÇÑ ¸Þ´º ¸í·ÉÀº ¾ø´Ù. ´Ý±â ¸í·É¸¸ Ãß°¡ÇØ º¸ÀÚ.

 

LRESULT CALLBACK DGChildProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)

{

     ....

     pSi=(SInfo *)GetWindowLongPtr(hWnd,0);

     if (pSi && iMessage > WM_USER) {

          ....

          if (iMessage == pSi->Ae.GetUserBase()+4) {

              AppendMenu((HMENU)wParam,MF_SEPARATOR,0,NULL);

              AppendMenu((HMENU)wParam,MF_STRING,0,"´Ý±â(&Q)");

              return 0;

          }

          if (iMessage == pSi->Ae.GetUserBase()+5) {

              switch (wParam) {

              case 0:

                   PostMessage(hWnd,WM_CLOSE,0,0);

                   break;

              }

          }

 

UserBase+4 ¸Þ½ÃÁö¸¦ ¹Þ¾ÒÀ» ¶§ ±¸ºÐ¼± Çϳª¸¦ Ãß°¡ÇÏ°í ±× ¾Æ·¡¿¡ ¸Þ´º Ç׸ñÀ» ´õ µî·ÏÇÑ´Ù. À̶§ ÁÖ¾îÁö´Â ID´Â ÀÚ½ÅÀÌ ±¸ºÐ¸¸ ÇÒ ¼ö ÀÖÀ¸¸é µÇ¹Ç·Î 0¹øºÎÅÍ ¼ø¼­´ë·Î ÁÖ¸é µÈ´Ù. ÄÁÆ®·ÑÀÇ IDM_AE_*¿Í¸¸ Áߺ¹µÇÁö ¾ÊÀ¸¸é ¾î¶² ID¶óµµ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¸Þ´ºÀÇ ÇÚµéÀÌ wParamÀ¸·Î Àü´ÞµÇ¾úÀ¸¹Ç·Î ÀÌ ¸Þ´º´Â ¸¶À½´ë·Î ¶â¾î °íÄ¥ ¼ö ÀÖ´Ù. Ãß°¡ÇÒ ¸í·ÉµéÀÌ ¾ÆÁÖ ¸¹´Ù¸é ¼­ºê ¸Þ´º¸¦ ´Ù´Â °Íµµ °¡´ÉÇÏ´Ù.

¸Þ´º°¡ ¼±ÅõǸé UserBase+5 ¸Þ½ÃÁö¸¦ ¹Þ´Âµ¥ À̶§ ÀÚ½ÅÀÌ µî·ÏÇÑ ¸Þ´º Ç׸ñÀÇ ID¿¡ ¹Ì¸® Á¤ÀÇµÈ µ¿ÀÛÀ» ÇÏ¸é µÈ´Ù. 0¹ø Ç׸ñÀº ´Ý±âÀ̹ǷΠÇöÀç ÆíÁýâÀ» ´Ý¾Ò´Ù. À̶§ DestroyWindow µîÀÇ ¸í·ÉÀ¸·Î ¹«Á¶°Ç ÆÄ±«Çؼ­´Â ¾ÈµÇ¸ç WM_CLOSE ¸Þ½ÃÁö¸¦ º¸³» ¹ÌÀúÀå ¹®¼­ È®ÀÎ ±âȸ¸¦ ÁÖ¾î¾ß ÇÑ´Ù. ¹®¼­¸¦ ÀúÀåÇØ¾ß ÇÑ´Ù¸é Ȱ¼ºÃ¢¿¡°Ô ÀúÀå ¸í·ÉÀ» ³»¸± ¼öµµ ÀÖ°í ¿É¼ÇÀ» º¯°æÇÏ´Â °Íµµ ¹°·Ð °¡´ÉÇÏ´Ù.