| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818 | // pcbuilderdialogDlg.cpp : implementation file//#include "stdafx.h"#include "CMakeSetup.h"#include "PathDialog.h"#include "CMakeSetupDialog.h"#include "CMakeCommandLineInfo.h" #include "../cmCacheManager.h"#include "../cmake.h"#include "../cmMakefileGenerator.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialog{public:  CAboutDlg();// Dialog Data  //{{AFX_DATA(CAboutDlg)  enum { IDD = IDD_ABOUTBOX };  //}}AFX_DATA  // ClassWizard generated virtual function overrides  //{{AFX_VIRTUAL(CAboutDlg)protected:  virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support  //}}AFX_VIRTUAL// Implementationprotected:  //{{AFX_MSG(CAboutDlg)  //}}AFX_MSG  DECLARE_MESSAGE_MAP()    };CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD){  //{{AFX_DATA_INIT(CAboutDlg)  //}}AFX_DATA_INIT}void CAboutDlg::DoDataExchange(CDataExchange* pDX){  CDialog::DoDataExchange(pDX);  //{{AFX_DATA_MAP(CAboutDlg)  //}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)  //{{AFX_MSG_MAP(CAboutDlg)  // No message handlers  //}}AFX_MSG_MAP  END_MESSAGE_MAP();void MFCMessageCallback(const char* m, const char* title, bool& nomore){   std::string message = m;  message += "\n\n(Press  Cancel to suppress any further messages.)";  if(::MessageBox(0, message.c_str(), title,                   MB_OKCANCEL) == IDCANCEL)    {    nomore = true;    }}/////////////////////////////////////////////////////////////////////////////// CMakeSetupDialog dialogCMakeSetupDialog::CMakeSetupDialog(const CMakeCommandLineInfo& cmdInfo,                                   CWnd* pParent /*=NULL*/)  : CDialog(CMakeSetupDialog::IDD, pParent){   cmSystemTools::SetErrorCallback(MFCMessageCallback);  m_RegistryKey  = "Software\\Kitware\\CMakeSetup\\Settings\\StartPath";    //{{AFX_DATA_INIT(CMakeSetupDialog)  m_WhereSource = cmdInfo.m_WhereSource;  m_WhereBuild = cmdInfo.m_WhereBuild;  m_GeneratorChoiceString = _T("");  //}}AFX_DATA_INIT  // Note that LoadIcon does not require a subsequent DestroyIcon in Win32  m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);  m_BuildPathChanged = false;  // Find the path to the cmake.exe executable  char fname[1024];  ::GetModuleFileName(NULL,fname,1023);  // extract just the path part  m_PathToExecutable = cmSystemTools::GetProgramPath(fname).c_str();  // add the cmake.exe to the path  m_PathToExecutable += "/cmake.exe";    m_oldCX = -1;  m_deltaXRemainder = 0;}void CMakeSetupDialog::DoDataExchange(CDataExchange* pDX){  CDialog::DoDataExchange(pDX);  //{{AFX_DATA_MAP(CMakeSetupDialog)	DDX_Control(pDX, IDC_Generator, m_GeneratorChoice);	DDX_Control(pDX, IDC_OK, m_OKButton);	DDX_Control(pDX, IDCANCEL, m_CancelButton);	DDX_CBStringExact(pDX, IDC_WhereSource, m_WhereSource);	DDX_CBStringExact(pDX, IDC_WhereBuild, m_WhereBuild);	DDX_Control(pDX, IDC_FRAME, m_ListFrame);	DDX_Control(pDX, IDC_WhereSource, m_WhereSourceControl);	DDX_Control(pDX, IDC_WhereBuild, m_WhereBuildControl);	DDX_Control(pDX, IDC_LIST2, m_CacheEntriesList);	DDX_Control(pDX, IDC_MouseHelpCaption, m_MouseHelp);	DDX_Control(pDX, IDC_CMAKE_VERSION, m_VersionDisplay);	DDX_Control(pDX, IDC_BuildProjects, m_Configure);	DDX_CBStringExact(pDX, IDC_Generator, m_GeneratorChoiceString);	//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CMakeSetupDialog, CDialog)  //{{AFX_MSG_MAP(CMakeSetupDialog)  ON_WM_SYSCOMMAND()  ON_WM_PAINT()  ON_WM_QUERYDRAGICON()  ON_BN_CLICKED(IDC_BUTTON2, OnBrowseWhereSource)  ON_BN_CLICKED(IDC_BuildProjects, OnConfigure)  ON_BN_CLICKED(IDC_BUTTON3, OnBrowseWhereBuild)  ON_CBN_EDITCHANGE(IDC_WhereBuild, OnChangeWhereBuild)  ON_CBN_SELCHANGE(IDC_WhereBuild, OnSelendokWhereBuild)  ON_CBN_EDITCHANGE(IDC_WhereSource, OnChangeWhereSource)  ON_CBN_SELENDOK(IDC_WhereSource, OnSelendokWhereSource)	ON_WM_SIZE()  ON_WM_GETMINMAXINFO()	ON_BN_CLICKED(IDC_OK, OnOk)  ON_BN_CLICKED(IDCANCEL, OnCancel)	ON_CBN_EDITCHANGE(IDC_Generator, OnEditchangeGenerator)	//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CMakeSetupDialog message handlersBOOL CMakeSetupDialog::OnInitDialog(){  CDialog::OnInitDialog();  // Add "About..." menu item to system menu.  // IDM_ABOUTBOX must be in the system command range.  ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);  ASSERT(IDM_ABOUTBOX < 0xF000);  CMenu* pSysMenu = GetSystemMenu(FALSE);  if (pSysMenu != NULL)    {    CString strAboutMenu;    strAboutMenu.LoadString(IDS_ABOUTBOX);    if (!strAboutMenu.IsEmpty())      {      pSysMenu->AppendMenu(MF_SEPARATOR);      pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);      }    }  // Set the icon for this dialog.  The framework does this automatically  //  when the application's main window is not a dialog  SetIcon(m_hIcon, TRUE);			// Set big icon  SetIcon(m_hIcon, FALSE);		// Set small icon  // Load source and build dirs from registry  this->LoadFromRegistry();  cmake m; // force a register of generators  std::vector<std::string> names;  cmMakefileGenerator::GetRegisteredGenerators(names);  for(std::vector<std::string>::iterator i = names.begin();      i != names.end(); ++i)    {    m_GeneratorChoice.AddString(i->c_str());    }  m_GeneratorChoiceString = "Visual Studio 6";  // try to load the cmake cache from disk  this->LoadCacheFromDiskToGUI();  m_WhereBuildControl.LimitText(2048);  m_WhereSourceControl.LimitText(2048);  m_GeneratorChoice.LimitText(2048);      // Set the version number  char tmp[1024];  sprintf(tmp,"Version %d.%d", cmMakefile::GetMajorVersion(),          cmMakefile::GetMinorVersion());  SetDlgItemText(IDC_CMAKE_VERSION, tmp);  this->UpdateData(FALSE);  return TRUE;  // return TRUE  unless you set the focus to a control}// About dialog invokevoid CMakeSetupDialog::OnSysCommand(UINT nID, LPARAM lParam){  if ((nID & 0xFFF0) == IDM_ABOUTBOX)    {    CAboutDlg dlgAbout;    dlgAbout.DoModal();    }  else    {    CDialog::OnSysCommand(nID, lParam);    }}// If you add a minimize button to your dialog, you will need the code below//  to draw the icon.  For MFC applications using the document/view model,//  this is automatically done for you by the framework.void CMakeSetupDialog::OnPaint() {  if (IsIconic())    {    CPaintDC dc(this); // device context for painting    SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);    // Center icon in client rectangle    int cxIcon = GetSystemMetrics(SM_CXICON);    int cyIcon = GetSystemMetrics(SM_CYICON);    CRect rect;    GetClientRect(&rect);    int x = (rect.Width() - cxIcon + 1) / 2;    int y = (rect.Height() - cyIcon + 1) / 2;    // Draw the icon    dc.DrawIcon(x, y, m_hIcon);    }  else    {    CDialog::OnPaint();    }}// The system calls this to obtain the cursor to display while the user drags//  the minimized window.HCURSOR CMakeSetupDialog::OnQueryDragIcon(){  return (HCURSOR) m_hIcon;}// Browse buttonbool CMakeSetupDialog::Browse(CString &result, const char *title){  CPathDialog dlg("Select Path", title, result);   if(dlg.DoModal()==IDOK)    {    result =  dlg.GetPathName();    return true;    }  else    {    return false;    }}void CMakeSetupDialog::SaveToRegistry(){   HKEY hKey;  DWORD dwDummy;  if(RegCreateKeyEx(HKEY_CURRENT_USER, 		    m_RegistryKey,		    0, "", REG_OPTION_NON_VOLATILE, KEY_READ|KEY_WRITE, 		    NULL, &hKey, &dwDummy) != ERROR_SUCCESS)     {    return;    }  else    {    // save some values    CString regvalue;    this->ReadRegistryValue(hKey, &(regvalue),"WhereSource1","C:\\");    int shiftEnd = 9;    if(m_WhereSource != regvalue)      {      char keyName[1024];      char keyName2[1024];      int i;      for (i = 2; i < 10; ++i)        {        regvalue = "";        sprintf(keyName,"WhereSource%i",i);        this->ReadRegistryValue(hKey, &(regvalue),keyName,"");        // check for short circuit, if the new value is already in        // the list then we stop        if (m_WhereSource == regvalue)          {          shiftEnd = i - 1;          }        }            for (i = shiftEnd; i; --i)        {        regvalue = "";        sprintf(keyName,"WhereSource%i",i);        sprintf(keyName2,"WhereSource%i",i+1);                this->ReadRegistryValue(hKey, &(regvalue),keyName,"");        if (strlen(regvalue))          {          RegSetValueEx(hKey, _T(keyName2), 0, REG_SZ,                         (CONST BYTE *)(const char *)regvalue,                         regvalue.GetLength());          }        }      RegSetValueEx(hKey, _T("WhereSource1"), 0, REG_SZ,                     (CONST BYTE *)(const char *)m_WhereSource,                     m_WhereSource.GetLength());      }        this->ReadRegistryValue(hKey, &(regvalue),"WhereBuild1","C:\\");    if(m_WhereBuild != regvalue)      {      int i;      char keyName[1024];      char keyName2[1024];      for (i = 2; i < 10; ++i)        {        regvalue = "";        sprintf(keyName,"WhereBuild%i",i);        this->ReadRegistryValue(hKey, &(regvalue),keyName,"");        // check for short circuit, if the new value is already in        // the list then we stop        if (m_WhereBuild == regvalue)          {          shiftEnd = i - 1;          }        }      for (i = shiftEnd; i; --i)        {        regvalue = "";        sprintf(keyName,"WhereBuild%i",i);        sprintf(keyName2,"WhereBuild%i",i+1);                this->ReadRegistryValue(hKey, &(regvalue),keyName,"");        if (strlen(regvalue))          {          RegSetValueEx(hKey, _T(keyName2), 0, REG_SZ,                         (CONST BYTE *)(const char *)regvalue,                         regvalue.GetLength());          }        }      RegSetValueEx(hKey, _T("WhereBuild1"), 0, REG_SZ,                     (CONST BYTE *)(const char *)m_WhereBuild,                     m_WhereBuild.GetLength());      }    }  RegCloseKey(hKey);}void CMakeSetupDialog::ReadRegistryValue(HKEY hKey,                                         CString *val,                                         const char *key,                                         const char *adefault){  DWORD dwType, dwSize;  char *pb;  dwType = REG_SZ;  pb = val->GetBuffer(MAX_PATH);  dwSize = MAX_PATH;  if(RegQueryValueEx(hKey,_T(key), NULL, &dwType, 		     (BYTE *)pb, &dwSize) != ERROR_SUCCESS)    {    val->ReleaseBuffer();    *val = _T(adefault);    }  else    {    val->ReleaseBuffer();    }}void CMakeSetupDialog::LoadFromRegistry(){   HKEY hKey;  if(RegOpenKeyEx(HKEY_CURRENT_USER, 		  m_RegistryKey, 		  0, KEY_READ, &hKey) != ERROR_SUCCESS)    {    return;    }  else    {    // load some values    if (m_WhereSource.IsEmpty())       {      this->ReadRegistryValue(hKey, &(m_WhereSource),"WhereSource1","C:\\");      }    if (m_WhereBuild.IsEmpty())       {      this->ReadRegistryValue(hKey, &(m_WhereBuild),"WhereBuild1","C:\\");      }    m_WhereSourceControl.AddString(m_WhereSource);    m_WhereBuildControl.AddString(m_WhereBuild);    char keyname[1024];    CString regvalue;    int i;    for (i = 2; i <= 10; ++i)      {      sprintf(keyname,"WhereSource%i",i);      regvalue = "";      this->ReadRegistryValue(hKey, &(regvalue),keyname,"C:\\");      if (strcmp("C:\\",regvalue))        {        m_WhereSourceControl.AddString(regvalue);        }      sprintf(keyname,"WhereBuild%i",i);      regvalue = "";      this->ReadRegistryValue(hKey, &(regvalue),keyname,"C:\\");      if (strcmp("C:\\",regvalue))        {        m_WhereBuildControl.AddString(regvalue);        }      }    }  RegCloseKey(hKey);}// Callback for browse source buttonvoid CMakeSetupDialog::OnBrowseWhereSource() {  this->UpdateData();  Browse(m_WhereSource, "Enter Path to Source");  this->UpdateData(false);  this->OnChangeWhereSource();}// Callback for browser build buttonvoid CMakeSetupDialog::OnBrowseWhereBuild() {  this->UpdateData();  Browse(m_WhereBuild, "Enter Path to Build");  this->UpdateData(false);  this->OnChangeWhereBuild();}void CMakeSetupDialog::RunCMake(bool generateProjectFiles){  if(!cmSystemTools::FileExists(m_WhereBuild))    {    std::string message =      "Build directory does not exist, should I create it?\n\n"      "Directory: ";    message += (const char*)m_WhereBuild;    if(MessageBox(message.c_str(), "Create Directory", MB_OKCANCEL) == IDOK)      {      cmSystemTools::MakeDirectory(m_WhereBuild);      }    else      {      MessageBox("Build Project aborted, nothing done.");      return;      }    }  // set the wait cursor  ::SetCursor(LoadCursor(NULL, IDC_WAIT));    // get all the info from the dialog  this->UpdateData();  // always save the current gui values to disk  this->SaveCacheFromGUI();  // Make sure we are working from the cache on disk  this->LoadCacheFromDiskToGUI();  // create a cmake object  cmake make;  // create the arguments for the cmake object  std::vector<std::string> args;  args.push_back((const char*)m_PathToExecutable);  std::string arg;  arg = "-H";  arg += m_WhereSource;  args.push_back(arg);  arg = "-B";  arg += m_WhereBuild;  args.push_back(arg);  arg = "-G";  arg += m_GeneratorChoiceString;  args.push_back(arg);  // run the generate process  if(make.Generate(args, generateProjectFiles) != 0)    {    cmSystemTools::Error(      "Error in generation process, project files may be invalid");    cmSystemTools::ResetErrorOccuredFlag();    }  // update the GUI with any new values in the caused by the  // generation process  this->LoadCacheFromDiskToGUI();  // save source and build paths to registry  this->SaveToRegistry();  // path is up-to-date now  m_BuildPathChanged = false;  // put the cursor back  ::SetCursor(LoadCursor(NULL, IDC_ARROW));}// Callback for build projects buttonvoid CMakeSetupDialog::OnConfigure() {  this->RunCMake(false);}// callback for combo box menu where build selectionvoid CMakeSetupDialog::OnSelendokWhereBuild() {  m_WhereBuildControl.GetLBText(m_WhereBuildControl.GetCurSel(),                                 m_WhereBuild);  m_WhereBuildControl.SetWindowText( m_WhereBuild);  this->UpdateData(FALSE);  this->OnChangeWhereBuild();}// callback for combo box menu where source selectionvoid CMakeSetupDialog::OnSelendokWhereSource() {  m_WhereSourceControl.GetLBText(m_WhereSourceControl.GetCurSel(),                                  m_WhereSource);  this->UpdateData(FALSE);  this->OnChangeWhereSource();}// callback for chaing source directoryvoid CMakeSetupDialog::OnChangeWhereSource() {}// callback for changing the build directoryvoid CMakeSetupDialog::OnChangeWhereBuild() {  this->UpdateData();  m_CacheEntriesList.RemoveAll();  m_CacheEntriesList.ShowWindow(SW_SHOW);  this->LoadCacheFromDiskToGUI();  m_BuildPathChanged = true;}// copy from the cache manager to the cache edit list boxvoid CMakeSetupDialog::FillCacheGUIFromCacheManager(){   int size = m_CacheEntriesList.GetItems().size();  bool reverseOrder = false;  // if there are already entries in the cache, then  // put the new ones in the top, so they show up first  if(size)    {    reverseOrder = true;    }    // all the current values are not new any more  std::set<CPropertyItem*> items = m_CacheEntriesList.GetItems();  for(std::set<CPropertyItem*>::iterator i = items.begin();      i != items.end(); ++i)    {    CPropertyItem* item = *i;    item->m_NewValue = false;    }  const cmCacheManager::CacheEntryMap &cache =    cmCacheManager::GetInstance()->GetCacheMap();  if(cache.size() == 0)    {    m_OKButton.EnableWindow(false);    }  else    {    m_OKButton.EnableWindow(true);    }  for(cmCacheManager::CacheEntryMap::const_iterator i = cache.begin();      i != cache.end(); ++i)    {    const char* key = i->first.c_str();    const cmCacheManager::CacheEntry& value = i->second;    switch(value.m_Type )      {      case cmCacheManager::BOOL:        if(cmSystemTools::IsOn(value.m_Value.c_str()))          {          m_CacheEntriesList.AddProperty(key,                                         "ON",                                         value.m_HelpString.c_str(),                                         CPropertyList::COMBO,"ON|OFF",                                         reverseOrder             );          }        else          {          m_CacheEntriesList.AddProperty(key,                                         "OFF",                                         value.m_HelpString.c_str(),                                         CPropertyList::COMBO,"ON|OFF",                                         reverseOrder            );          }        break;      case cmCacheManager::PATH:        m_CacheEntriesList.AddProperty(key,                                        value.m_Value.c_str(),                                       value.m_HelpString.c_str(),                                       CPropertyList::PATH,"",                                       reverseOrder          );        break;      case cmCacheManager::FILEPATH:        m_CacheEntriesList.AddProperty(key,                                        value.m_Value.c_str(),                                       value.m_HelpString.c_str(),                                       CPropertyList::FILE,"",                                       reverseOrder          );        break;      case cmCacheManager::STRING:        m_CacheEntriesList.AddProperty(key,                                       value.m_Value.c_str(),                                       value.m_HelpString.c_str(),                                       CPropertyList::EDIT,"",                                       reverseOrder          );        break;      case cmCacheManager::INTERNAL:	m_CacheEntriesList.RemoveProperty(key);        break;      }    }  // redraw the list  m_CacheEntriesList.SetTopIndex(0);  m_CacheEntriesList.Invalidate();}// copy from the list box to the cache managervoid CMakeSetupDialog::FillCacheManagerFromCacheGUI(){   cmCacheManager::GetInstance()->GetCacheMap();  std::set<CPropertyItem*> items = m_CacheEntriesList.GetItems();  for(std::set<CPropertyItem*>::iterator i = items.begin();      i != items.end(); ++i)    {    CPropertyItem* item = *i;     cmCacheManager::CacheEntry *entry =       cmCacheManager::GetInstance()->GetCacheEntry(        (const char*)item->m_propName);    if (entry)      {      entry->m_Value = item->m_curValue;      }    }}  //! Load cache file from m_WhereBuild and display in GUI editorvoid CMakeSetupDialog::LoadCacheFromDiskToGUI(){  if(m_WhereBuild != "")    {    cmCacheManager::GetInstance()->LoadCache(m_WhereBuild);    this->FillCacheGUIFromCacheManager();    if(cmCacheManager::GetInstance()->GetCacheEntry("CMAKE_GENERATOR"))      {      std::string curGen =         cmCacheManager::GetInstance()->GetCacheEntry("CMAKE_GENERATOR")->m_Value;      if(m_GeneratorChoiceString != curGen.c_str())        {        m_GeneratorChoiceString = curGen.c_str();        this->UpdateData(FALSE);        }      }    }}//! Save GUI values to cmCacheManager and then save to disk.void CMakeSetupDialog::SaveCacheFromGUI(){  this->FillCacheManagerFromCacheGUI();  if(m_WhereBuild != "")    {    cmCacheManager::GetInstance()->SaveCache(m_WhereBuild);    }}void CMakeSetupDialog::OnSize(UINT nType, int cx, int cy) {  if (nType == SIZE_MINIMIZED)    {    CDialog::OnSize(nType, cx, cy);    return;    }    if (m_oldCX == -1)    {    m_oldCX = cx;    m_oldCY = cy;    }  int deltax = cx - m_oldCX;  int deltay = cy - m_oldCY;  m_oldCX = cx;  m_oldCY = cy;  CDialog::OnSize(nType, cx, cy);  if (deltax == 0 && deltay == 0)    {    return;    }    if(m_CacheEntriesList.m_hWnd)    {    // get the original sizes/positions    CRect cRect;    m_ListFrame.GetWindowRect(&cRect);    m_ListFrame.SetWindowPos(&wndTop, cRect.left, cRect.top,                              cRect.Width() + deltax,                              cRect.Height() + deltay,                              SWP_NOMOVE | SWP_NOZORDER);    m_CacheEntriesList.GetWindowRect(&cRect);    m_CacheEntriesList.SetWindowPos(&wndTop, cRect.left, cRect.top,                              cRect.Width() + deltax,                              cRect.Height() + deltay,                              SWP_NOMOVE | SWP_NOZORDER);    m_VersionDisplay.SetWindowPos(&wndTop, 5, cy-23, 0, 0,                                  SWP_NOSIZE | SWP_NOZORDER);    deltax = deltax + m_deltaXRemainder;    m_deltaXRemainder = deltax%2;    m_MouseHelp.GetWindowRect(&cRect);    this->ScreenToClient(&cRect);    m_MouseHelp.SetWindowPos(&wndTop, cRect.left + deltax/2,                              cRect.top + deltay,                              0, 0,                             SWP_NOSIZE | SWP_NOZORDER);    m_Configure.GetWindowRect(&cRect);    this->ScreenToClient(&cRect);    m_Configure.SetWindowPos(&wndTop, cRect.left + deltax/2,                                  cRect.top + deltay,                                  0, 0,                                 SWP_NOSIZE | SWP_NOZORDER);    m_CancelButton.GetWindowRect(&cRect);    this->ScreenToClient(&cRect);    m_CancelButton.SetWindowPos(&wndTop, cRect.left + deltax/2,                                 cRect.top + deltay,                                 0, 0,                                SWP_NOSIZE | SWP_NOZORDER);    m_OKButton.GetWindowRect(&cRect);    this->ScreenToClient(&cRect);    m_OKButton.SetWindowPos(&wndTop, cRect.left + deltax/2,                             cRect.top + deltay,                             0, 0,                            SWP_NOSIZE | SWP_NOZORDER);    }  }void CMakeSetupDialog::OnGetMinMaxInfo( MINMAXINFO FAR* lpMMI ){  lpMMI->ptMinTrackSize.x = 550;  lpMMI->ptMinTrackSize.y = 272;}void CMakeSetupDialog::OnCancel(){  if(m_CacheEntriesList.IsDirty())    {    if(MessageBox("You have changed options but not rebuilt, "		  "are you sure you want to exit?", "Confirm Exit",		  MB_YESNO) == IDYES)      {      CDialog::OnOK();      }    }  else    {    CDialog::OnOK();    }}void CMakeSetupDialog::OnOk() {  m_CacheEntriesList.ClearDirty();  this->RunCMake(true);  cmMakefileGenerator::UnRegisterGenerators();  CDialog::OnOK();}void CMakeSetupDialog::OnEditchangeGenerator() {	// TODO: Add your control notification handler code here	}
 |