[dasher: 30/61] Simplified Status control creation.



commit 69119eaebc77c25600c75b197bfa62eaf581f7d3
Author: Ada Majorek <amajorek google com>
Date:   Fri Jul 22 15:17:22 2016 -0700

    Simplified Status control creation.
    
    By loading layout from resources.
    This should also get rid of puzzling doctor memory warnings.

 Src/Win32/Dasher.rc                 |   68 ++++++++++--
 Src/Win32/Widgets/StatusControl.cpp |  198 ++++++++---------------------------
 Src/Win32/Widgets/StatusControl.h   |   43 +++-----
 Src/Win32/resource.h                |    8 +-
 4 files changed, 122 insertions(+), 195 deletions(-)
---
diff --git a/Src/Win32/Dasher.rc b/Src/Win32/Dasher.rc
index 88921ef..80f57e3 100644
--- a/Src/Win32/Dasher.rc
+++ b/Src/Win32/Dasher.rc
@@ -59,6 +59,52 @@ END
 
 #endif    // APSTUDIO_INVOKED
 
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+IDD_STATUSBAR DIALOGEX 0, 0, 151, 14
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD
+FONT 8, "MS Shell Dlg", 400, 0, 0x1
+BEGIN
+    RTEXT           "Speed:",IDC_STATIC,0,3,29,8
+    EDITTEXT        IDC_SPEED_EDIT,30,0,28,14,ES_RIGHT,WS_EX_CLIENTEDGE
+    CONTROL         "",IDC_SPEED_SPIN,"msctls_updown32",UDS_ALIGNRIGHT | UDS_ARROWKEYS,58,0,10,14
+    RTEXT           "Alphabet:",IDC_STATIC,69,3,40,8
+    COMBOBOX        IDC_ALPHABET_COMBO,110,1,48,14,CBS_DROPDOWNLIST,WS_EX_CLIENTEDGE
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// DESIGNINFO
+//
+
+#ifdef APSTUDIO_INVOKED
+GUIDELINES DESIGNINFO
+BEGIN
+    IDD_STATUSBAR, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        VERTGUIDE, 148
+        TOPMARGIN, 7
+    END
+END
+#endif    // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// AFX_DIALOG_LAYOUT
+//
+
+IDD_STATUSBAR AFX_DIALOG_LAYOUT
+BEGIN
+    0
+END
+
 #endif    // English (United States) resources
 /////////////////////////////////////////////////////////////////////////////
 
@@ -281,6 +327,17 @@ END
 
 /////////////////////////////////////////////////////////////////////////////
 //
+// AFX_DIALOG_LAYOUT
+//
+
+IDD_APPPAGE AFX_DIALOG_LAYOUT
+BEGIN
+    0
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
 // Icon
 //
 
@@ -391,17 +448,6 @@ END
 
 /////////////////////////////////////////////////////////////////////////////
 //
-// AFX_DIALOG_LAYOUT
-//
-
-IDD_APPPAGE AFX_DIALOG_LAYOUT
-BEGIN
-    0
-END
-
-
-/////////////////////////////////////////////////////////////////////////////
-//
 // String Table
 //
 
diff --git a/Src/Win32/Widgets/StatusControl.cpp b/Src/Win32/Widgets/StatusControl.cpp
index 2d510da..cc55ca6 100644
--- a/Src/Win32/Widgets/StatusControl.cpp
+++ b/Src/Win32/Widgets/StatusControl.cpp
@@ -4,11 +4,10 @@
 
 #include <string>
 
-CStatusControl::CStatusControl(Dasher::CSettingsUser *pCreateFrom, CAppSettings *pAppSettings) 
-       : CSettingsObserver(pCreateFrom), m_pAppSettings(pAppSettings) {
-  m_hEdit = m_hUpDown = m_hCombo = m_hSpeedLabel = m_hAlphabetLabel =0;
-
-  m_iEditWidth = m_iEditHeight = 0;
+CStatusControl::CStatusControl(Dasher::CSettingsUser *pCreateFrom, CAppSettings *pAppSettings)
+  : CSettingsObserver(pCreateFrom),
+  m_pAppSettings(pAppSettings),
+  m_dialogHeight(0) {
 }
 
 void CStatusControl::HandleEvent(int iParameter) {
@@ -25,164 +24,55 @@ void CStatusControl::HandleEvent(int iParameter) {
                break;
        }
 }
+LRESULT CStatusControl::OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) {
+    m_hEdit = GetDlgItem(IDC_SPEED_EDIT);
+    m_hUpDown = GetDlgItem(IDC_SPEED_SPIN);
+    m_hCombo = GetDlgItem(IDC_ALPHABET_COMBO);
 
-// TODO: ATL has more sophisticated handlers for conrol and notify messages - consider using them instead
-LRESULT CStatusControl::OnCommand(UINT message, WPARAM wParam, LPARAM lParam, BOOL& bHandled) {
-  switch(HIWORD(wParam)) {
-    case CBN_SELCHANGE:
-      SelectAlphabet();
-      break;
-    default:
-      bHandled = false;
-      break;
-  }
+    RECT r = { 0,0,0,14 };
+    MapDialogRect(&r);
+    m_dialogHeight = r.bottom;
 
-  return 0;
+    m_hEdit.SendMessage(EM_LIMITTEXT, (WPARAM)4, (LPARAM)0);
+    m_hUpDown.SendMessage(UDM_SETRANGE, 0, (LPARAM)MAKELONG(800, 1));
+
+    PopulateCombo();
+    PopulateSpeed();
+    return 1;
 }
 
-LRESULT CStatusControl::OnNotify(UINT message, WPARAM wParam, LPARAM lParam, BOOL& bHandled) {
-  NMHDR *pNotify((LPNMHDR)lParam);
-
-  switch(pNotify->code) {
-    case UDN_DELTAPOS:
-      UpdateSpeed(((LPNMUPDOWN) lParam)->iPos, ((LPNMUPDOWN) lParam)->iDelta);
-      break;
-    case EN_CHANGE:
-      {
-        TCHAR wszBuffer[32];
-        SendMessage(m_hEdit, WM_GETTEXT, 32, (long)wszBuffer);
-        double dNewSpeed = _tstof(wszBuffer);
-
-        m_pAppSettings->SetLongParameter(LP_MAX_BITRATE, dNewSpeed * 100);
-      }
-      break;
-    default:
-      bHandled = false;
-      break;
-  }
+LRESULT CStatusControl::OnSpeedSpinChange(int idCtrl, LPNMHDR pNMHDR, BOOL& bHandled) {
+  LPNMUPDOWN pUpDown = reinterpret_cast<LPNMUPDOWN>(pNMHDR);
 
+  if (pUpDown->hdr.code == UDN_DELTAPOS)
+    UpdateSpeed(pUpDown->iPos, pUpDown->iDelta);
+  else
+    bHandled = false;
   return 0;
 }
 
-LRESULT CStatusControl::OnSize(UINT message, WPARAM wParam, LPARAM lParam, BOOL& bHandled) {
-  LayoutChildrenUpdate();
+LRESULT CStatusControl::OnSpeedEditChange(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) {
+  CString wideText;
+  m_hEdit.GetWindowText(wideText);
+  double dNewSpeed = _tstof(wideText);
+  m_pAppSettings->SetLongParameter(LP_MAX_BITRATE, dNewSpeed * 100);
   return 0;
 }
 
-HWND CStatusControl::Create(HWND hParent) {
-  CWindowImpl<CStatusControl>::Create(hParent, 0, 0, WS_VISIBLE | WS_CHILD );
-
-  CreateChildren();
-
-  PopulateCombo();
-  PopulateSpeed();
-
-  LayoutChildrenInitial();
-
-  return m_hWnd;
-}
-
-void CStatusControl::CreateChildren() {
-  // First create the two static labels.
-  HGDIOBJ hGuiFont;
-  hGuiFont = GetStockObject(DEFAULT_GUI_FONT);
-
-  std::wstring strSpeedLabel(L"Speed:");
-  std::wstring strAlphabetLabel(L"Alphabet:");
-
-  // TODO: Wrap windows here in CWindow classes.
-  m_hSpeedLabel = CreateWindowEx(WS_EX_CONTROLPARENT, TEXT("STATIC"), strSpeedLabel.c_str(), 
-      SS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 0, 0, 0, 0, m_hWnd, NULL, WinHelper::hInstApp, NULL);
-
-  m_hAlphabetLabel = CreateWindowEx(WS_EX_CONTROLPARENT, TEXT("STATIC"), strAlphabetLabel.c_str(), 
-      SS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 0, 0, 0, 0, m_hWnd, NULL, WinHelper::hInstApp, NULL);
-
-  SendMessage(m_hSpeedLabel, WM_SETFONT, (WPARAM) hGuiFont, true);
-  SendMessage(m_hAlphabetLabel, WM_SETFONT, (WPARAM) hGuiFont, true);
-
-  SIZE sSize;
-
-  HDC hSpeedDC(::GetDC(m_hSpeedLabel));
-  SelectObject(hSpeedDC, hGuiFont);
-  GetTextExtentPoint32(hSpeedDC, strSpeedLabel.c_str(), strSpeedLabel.size(), &sSize);
-  ::MoveWindow(m_hSpeedLabel, 0, 0, sSize.cx + 4, sSize.cy, false);
-  ::ReleaseDC(m_hSpeedLabel, hSpeedDC);
-
-  HDC hAlphabetDC(::GetDC(m_hAlphabetLabel));
-  SelectObject(hAlphabetDC, hGuiFont);
-  GetTextExtentPoint32(hAlphabetDC, strAlphabetLabel.c_str(), strAlphabetLabel.size(), &sSize);
-  ::MoveWindow(m_hAlphabetLabel, 0, 0, sSize.cx + 4, sSize.cy, false);
-  ::ReleaseDC(m_hAlphabetLabel, hAlphabetDC);
-
-  // Next the edit box and up/down control
-  m_hEdit = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("EDIT"), TEXT(""), WS_CHILD | WS_TABSTOP | WS_VISIBLE | 
WS_GROUP, 0, 0, 0, CW_USEDEFAULT, m_hWnd, NULL, WinHelper::hInstApp, NULL);
-  SendMessage(m_hEdit, EM_LIMITTEXT, (WPARAM) 4, (LPARAM) 0);
-
-  HDC hdc = ::GetDC(m_hEdit);
-  TEXTMETRIC tmGui;
-  GetTextMetrics(hdc, &tmGui);
-  SendMessage(m_hEdit, WM_SETFONT, (WPARAM) hGuiFont, true);
-  ::ReleaseDC(m_hEdit, hdc);
-
-  m_iEditHeight = tmGui.tmHeight + (GetSystemMetrics(SM_CYEDGE) * 2);
-  m_iEditWidth = tmGui.tmAveCharWidth * 7;
-  ::MoveWindow(m_hEdit, 0, 0, m_iEditWidth, m_iEditHeight, false);
- 
-  m_hUpDown = CreateWindowEx(WS_EX_CLIENTEDGE, UPDOWN_CLASS, TEXT(""), UDS_ALIGNRIGHT | WS_CHILD  | 
WS_TABSTOP |WS_VISIBLE |  WS_GROUP, 0, 0, 16, 16, m_hWnd, NULL, WinHelper::hInstApp, NULL);
-  SendMessage(m_hUpDown, UDM_SETRANGE, 0, (LPARAM) MAKELONG(800, 1));
-
-  // And finally the combo box
-  m_hCombo = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("COMBOBOX"), TEXT(""), CBS_DROPDOWNLIST | WS_CHILD | 
WS_TABSTOP | WS_VISIBLE |WS_GROUP | ES_READONLY, 0, 0, 128, 128, m_hWnd, NULL, WinHelper::hInstApp, NULL);
-  SendMessage(m_hCombo, WM_SETFONT, (WPARAM) hGuiFont, true);
-
-  DeleteObject(hGuiFont);
-
-  // Set the height to what is finally required. The extra pixel is needed to get everything to line up 
nicely
-  MoveWindow(0, 0, 0, m_iEditHeight+1, false);
+LRESULT CStatusControl::OnAlphabetChanged(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) {
+  SelectAlphabet();
+  return 0;
 }
 
-void CStatusControl::LayoutChildrenInitial() {
+LRESULT CStatusControl::OnSize(UINT message, WPARAM wParam, LPARAM lParam, BOOL& bHandled) {
   RECT rc;
-  GetWindowRect(&rc);
-
-  // And how much is needed for the various bits and pieces
-  RECT sRect;
-  
-  ::GetWindowRect(m_hSpeedLabel, &sRect);
-  int iSpeedLabelWidth(sRect.right - sRect.left);  
-  int iSpeedLabelHeight(sRect.bottom - sRect.top);
-  
-  ::GetWindowRect(m_hAlphabetLabel, &sRect);
-  int iAlphabetLabelWidth(sRect.right - sRect.left);  
-  int iAlphabetLabelHeight(sRect.bottom - sRect.top);
-  
-  ::GetWindowRect(m_hEdit, &sRect);
-  int iEditHeight(sRect.bottom - sRect.top);
-  
-  ::GetWindowRect(m_hCombo, &sRect);
-  int iComboWidth(sRect.right - sRect.left);  
-  int iComboHeight(sRect.bottom - sRect.top);
-
-  // Finally, do the layout
-  // TODO: This isn't necessary - the only thing which is going to change is the width of the combo
-  int iPosition(0);
-
-  ::MoveWindow(m_hSpeedLabel, iPosition, (iEditHeight - iSpeedLabelHeight) / 2, iSpeedLabelWidth, 
iSpeedLabelHeight, TRUE);
-  iPosition += iSpeedLabelWidth + 2;
-
-  ::MoveWindow(m_hEdit, iPosition, 0, m_iEditWidth, iEditHeight, TRUE);
-  ::SendMessage(m_hUpDown, UDM_SETBUDDY, (WPARAM)m_hEdit, 0);
-  iPosition += m_iEditWidth + 2;
-
-  ::MoveWindow(m_hAlphabetLabel, iPosition, (iEditHeight - iAlphabetLabelHeight) / 2, iAlphabetLabelWidth, 
iAlphabetLabelHeight, TRUE);
-  iPosition += iAlphabetLabelWidth + 2;
-
-  ::MoveWindow(m_hCombo, iPosition, 0, rc.right - rc.left - iPosition, iComboHeight, TRUE);
-}
-
-void CStatusControl::LayoutChildrenUpdate() {
-  // For now don't do anything special here
-  LayoutChildrenInitial();
+  GetClientRect(&rc);
+  RECT comboRc;
+  m_hCombo.GetWindowRect(&comboRc);
+  ScreenToClient(&comboRc);
+  comboRc.right = rc.right - rc.left;
+  m_hCombo.MoveWindow(&comboRc, true);
+  return 0;
 }
 
 void CStatusControl::PopulateCombo() {
@@ -240,11 +130,9 @@ void CStatusControl::SelectAlphabet() {
 void CStatusControl::PopulateSpeed() {
   int iValue(m_pAppSettings->GetLongParameter(LP_MAX_BITRATE));
 
-  TCHAR *Buffer = new TCHAR[10];
+  TCHAR Buffer[10];
   _stprintf(Buffer, TEXT("%0.2f"), iValue / 100.0);
   SendMessage(m_hEdit, WM_SETTEXT, 0, (LPARAM) (LPCSTR) Buffer);
-  delete[]Buffer;
-
   SendMessage(m_hUpDown, UDM_SETPOS, 0, (LPARAM) MAKELONG ((short)iValue, 0));
 }
 
@@ -257,10 +145,10 @@ void CStatusControl::UpdateSpeed(int iPos, int iDelta) {
   if(iValue < 1)
     iValue = 1;
 
-  TCHAR *Buffer = new TCHAR[10];
+  TCHAR Buffer[10];
   _stprintf(Buffer, TEXT("%0.2f"), iValue / 100.0);
-  SendMessage(m_hEdit, WM_SETTEXT, 0, (LPARAM) (LPCSTR) Buffer);
-  delete[]Buffer;
+  SendMessage(m_hEdit, WM_SETTEXT, 0, (LPARAM)(LPCSTR)Buffer);
 
   m_pAppSettings->SetLongParameter(LP_MAX_BITRATE, iValue);
+
 }
diff --git a/Src/Win32/Widgets/StatusControl.h b/Src/Win32/Widgets/StatusControl.h
index 35e16ed..102dd98 100644
--- a/Src/Win32/Widgets/StatusControl.h
+++ b/Src/Win32/Widgets/StatusControl.h
@@ -4,46 +4,39 @@
 #include "../Common/WinCommon.h"
 #include "../../DasherCore/SettingsStore.h"
 #include "../AppSettings.h"
+#include "../resource.h"
 
 #include <atlbase.h>
 #include <atlwin.h>
 
-class CStatusControl : public ATL::CWindowImpl<CStatusControl>, public Dasher::CSettingsObserver {
+class CStatusControl : public ATL::CDialogImpl<CStatusControl>, public Dasher::CSettingsObserver {
 public:
        CStatusControl(Dasher::CSettingsUser *pCreateFrom, CAppSettings *pAppSettings);
 
-  // ATL boilerplate code
-  DECLARE_WND_SUPERCLASS(L"STATUSCONTROL", L"STATIC");
+    enum { IDD = IDD_STATUSBAR};
 
   BEGIN_MSG_MAP(CStatusControl)
-    MESSAGE_HANDLER(WM_COMMAND, OnCommand)
-    MESSAGE_HANDLER(WM_NOTIFY, OnNotify)
+    MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
     MESSAGE_HANDLER(WM_SIZE, OnSize)
+    COMMAND_HANDLER(IDC_ALPHABET_COMBO, CBN_SELCHANGE, OnAlphabetChanged)
+    COMMAND_HANDLER(IDC_SPEED_EDIT, EN_CHANGE, OnSpeedEditChange)
+    NOTIFY_HANDLER(IDC_SPEED_SPIN, UDN_DELTAPOS, OnSpeedSpinChange)
   END_MSG_MAP()
 
   // Message handlers:
-  LRESULT OnCommand(UINT message, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
-  LRESULT OnNotify(UINT message, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
+  LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
   LRESULT OnSize(UINT message, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
+  LRESULT OnAlphabetChanged(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
+  LRESULT OnSpeedEditChange(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
+  LRESULT OnSpeedSpinChange(int idCtrl, LPNMHDR pNMHDR, BOOL& bHandled);
 
-  // Create the window, with children
-  HWND Create(HWND hParent);
 
   int GetHeight() {
-    return m_iEditHeight + 2;
+    return m_dialogHeight;
   }
   void HandleEvent(int iParameter);
 
 private:
-  // Create the child windows of the control
-  void CreateChildren();
-
-  // Initial layout of child windows
-  void LayoutChildrenInitial();
-
-  // Incremental update of child windows
-  void LayoutChildrenUpdate();
-
   // Update the contents of the alphabet seletion combo
   void PopulateCombo();
 
@@ -60,14 +53,10 @@ private:
   CAppSettings *m_pAppSettings;
 
   // Handles to child windows
-  HWND m_hEdit;
-  HWND m_hUpDown;
-  HWND m_hCombo;
-  HWND m_hSpeedLabel;
-  HWND m_hAlphabetLabel;
-
-  int m_iEditWidth;
-  int m_iEditHeight;
+  CWindow m_hEdit;
+  CWindow m_hUpDown;
+  CWindow m_hCombo;
+  int m_dialogHeight;
 };
 
 #endif
\ No newline at end of file
diff --git a/Src/Win32/resource.h b/Src/Win32/resource.h
index f4a802e..cde219a 100644
--- a/Src/Win32/resource.h
+++ b/Src/Win32/resource.h
@@ -36,6 +36,7 @@
 #define IDD_APPEARANCEPAGE              178
 #define IDD_APPPAGE                     179
 #define IDD_MODULESETTINGS              180
+#define IDD_STATUSBAR                   182
 #define IDC_INPUT_LIST                  1008
 #define IDC_CONTROL_LIST                1009
 #define IDC_ALPHABETS                   1010
@@ -90,6 +91,9 @@
 #define IDC_CHECK5                      1157
 #define IDC_CONTROLBOXES                1160
 #define IDC_FILE_ENCODING               1161
+#define IDC_SPEED_EDIT                  1163
+#define IDC_SPEED_SPIN                  1164
+#define IDC_ALPHABET_COMBO              1166
 #define ID_EDIT_SELECTALL               32775
 #define ID_HELP_CONTENTS                32776
 #define ID_EDIT_COPY_ALL                32798
@@ -107,9 +111,9 @@
 // 
 #ifdef APSTUDIO_INVOKED
 #ifndef APSTUDIO_READONLY_SYMBOLS
-#define _APS_NEXT_RESOURCE_VALUE        182
+#define _APS_NEXT_RESOURCE_VALUE        184
 #define _APS_NEXT_COMMAND_VALUE         32820
-#define _APS_NEXT_CONTROL_VALUE         1162
+#define _APS_NEXT_CONTROL_VALUE         1167
 #define _APS_NEXT_SYMED_VALUE           110
 #endif
 #endif


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]