Skip to content

Commit

Permalink
bugfix: first time a chat is loaded and SetScrollInfo inserts a scrol…
Browse files Browse the repository at this point in the history
…l bar the client width reduces, but the backbuffer is already painted which caused graphic overlapping messages
  • Loading branch information
andreas-mausch committed May 2, 2014
1 parent 37585f6 commit c17cc8d
Show file tree
Hide file tree
Showing 5 changed files with 61 additions and 35 deletions.
54 changes: 41 additions & 13 deletions source/Platforms/Win32/GUI/ChatControl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ ChatControl::ChatControl(HWND window)
this->window = window;
dateFont = new Font(CreateFont(13, 0, 0, 0, FW_NORMAL, 0, 0, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, L"Courier New"));
chat = NULL;
shouldResizeMessages = true;
}

ChatControl::~ChatControl()
Expand Down Expand Up @@ -58,10 +59,10 @@ void ChatControl::registerChatControl()

void ChatControl::setChat(WhatsappChat &chat)
{
deleteBackbuffer();
this->chat = &chat;
SetScrollPos(window, SB_VERT, 0, TRUE);
buildMessages();
paintBackbuffer();
redraw();
}

Expand Down Expand Up @@ -126,6 +127,12 @@ void ChatControl::buildMessages()
}

void ChatControl::resizeMessages()
{
resizeMessageWidths();
calculateScrollInfo();
}

void ChatControl::resizeMessageWidths()
{
RECT clientRect;
GetClientRect(window, &clientRect);
Expand All @@ -140,8 +147,6 @@ void ChatControl::resizeMessages()
messageFrame.updateWidth(window, width);
y += 8 + messageFrame.getHeight();
}

calculateScrollInfo();
}

void ChatControl::clearMessages()
Expand Down Expand Up @@ -203,12 +208,12 @@ void ChatControl::paintBackbuffer()
{
HANDLE oldFont = SelectObject(backbuffer, GetStockObject(DEFAULT_GUI_FONT));
SetTextColor(backbuffer, RGB(0, 0, 0));
SetBkColor(backbuffer, RGB(230, 230, 210));
SetBkColor(backbuffer, GetSysColor(COLOR_3DFACE));

RECT clientRect;
GetClientRect(window, &clientRect);

Brush brush(CreateSolidBrush(RGB(230, 230, 210)));
Brush brush(CreateSolidBrush(GetSysColor(COLOR_3DFACE)));
FillRect(backbuffer, &clientRect, brush.get());

int scrollPosition = GetScrollPos(window, SB_VERT);
Expand Down Expand Up @@ -277,6 +282,11 @@ void ChatControl::paintBackbuffer()

LRESULT ChatControl::onPaint()
{
if (!backbuffer)
{
createBackbuffer();
}

HDC deviceContext;
PAINTSTRUCT paint;

Expand Down Expand Up @@ -408,10 +418,6 @@ LRESULT CALLBACK ChatControl::ChatControlCallback(HWND window, UINT message, WPA

chatControl->createBackbuffer();
} break;
case WM_CHATCONTROL_SETCHAT:
{
chatControl->setChat(*reinterpret_cast<WhatsappChat *>(lParam));
} break;
case WM_PAINT:
{
return chatControl->onPaint();
Expand Down Expand Up @@ -473,14 +479,36 @@ LRESULT CALLBACK ChatControl::ChatControlCallback(HWND window, UINT message, WPA
{
return DLGC_WANTARROWS;
} break;
case WM_CHATCONTROL_REPAINT:
case WM_CHATCONTROL:
{
chatControl->resizeMessages();
chatControl->createBackbuffer();
chatControl->redraw();
switch (wParam)
{
case CHAT_CONTROL_SETCHAT:
{
chatControl->setChat(*reinterpret_cast<WhatsappChat *>(lParam));
} break;
case CHAT_CONTROL_START_RESIZING_MESSAGES:
{
chatControl->shouldResizeMessages = true;
} break;
case CHAT_CONTROL_STOP_RESIZING_MESSAGES:
{
chatControl->shouldResizeMessages = false;
} break;
case CHAT_CONTROL_REDRAW:
{
chatControl->resizeMessages();
chatControl->createBackbuffer();
chatControl->redraw();
} break;
}
} break;
case WM_SIZE:
{
if (chatControl->shouldResizeMessages)
{
chatControl->resizeMessages();
}
chatControl->createBackbuffer();
chatControl->redraw();
} break;
Expand Down
13 changes: 11 additions & 2 deletions source/Platforms/Win32/GUI/ChatControl.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,15 @@ class ImageDecoder;
class Smileys;
class WhatsappChat;

#define WM_CHATCONTROL_SETCHAT (WM_USER+0)
#define WM_CHATCONTROL_REPAINT (WM_USER+1)
#define WM_CHATCONTROL (WM_USER+0)

enum ChatControlMessages
{
CHAT_CONTROL_SETCHAT,
CHAT_CONTROL_START_RESIZING_MESSAGES,
CHAT_CONTROL_STOP_RESIZING_MESSAGES,
CHAT_CONTROL_REDRAW
};

class ChatControl
{
Expand All @@ -23,6 +30,7 @@ class ChatControl
HBITMAP backbufferBitmap;
WhatsappChat *chat;
std::vector<ChatControlMessageFrame *> messages;
bool shouldResizeMessages;

static LRESULT CALLBACK ChatControlCallback(HWND window, UINT message, WPARAM wParam, LPARAM lParam);

Expand All @@ -32,6 +40,7 @@ class ChatControl
void clearMessages();
void calculateScrollInfo();
void resizeMessages();
void resizeMessageWidths();

LRESULT onPaint();
void drawMessage(ChatControlMessageFrame &messageFrame, HDC deviceContext, int y, int clientRectWidth, HGDIOBJ dateFont);
Expand Down
2 changes: 1 addition & 1 deletion source/Platforms/Win32/GUI/Dialog.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#pragma once

#define WM_DIALOG (WM_USER+2)
#define WM_DIALOG (WM_USER+1)

enum DialogMessage
{
Expand Down
26 changes: 8 additions & 18 deletions source/Platforms/Win32/GUI/MainWindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@

MainWindow::MainWindow(Settings &settings)
: settings(settings), database(NULL), sortingColumn(1), sortingDirection(SORTING_DIRECTION_DESCENDING),
maximized(false), dialog(NULL), accelerator(MAKEINTRESOURCE(IDR_ACCELERATOR)), aboutDialog(NULL)
dialog(NULL), accelerator(MAKEINTRESOURCE(IDR_ACCELERATOR)), aboutDialog(NULL)
{
CoInitialize(NULL);

Expand Down Expand Up @@ -209,7 +209,7 @@ void MainWindow::addChat(WhatsappChat &chat)

void MainWindow::selectChat(WhatsappChat *chat)
{
SendDlgItemMessage(dialog, IDC_MAIN_MESSAGES, WM_CHATCONTROL_SETCHAT, 0, reinterpret_cast<LPARAM>(chat));
SendDlgItemMessage(dialog, IDC_MAIN_MESSAGES, WM_CHATCONTROL, CHAT_CONTROL_SETCHAT, reinterpret_cast<LPARAM>(chat));
SetWindowLongPtr(GetDlgItem(dialog, IDC_MAIN_EXPORT), GWLP_USERDATA, reinterpret_cast<LPARAM>(chat));
EnableWindow(GetDlgItem(dialog, IDC_MAIN_EXPORT), chat != NULL);
}
Expand Down Expand Up @@ -566,28 +566,18 @@ INT_PTR MainWindow::handleMessage(HWND dialog, UINT message, WPARAM wParam, LPAR
HDROP drop = reinterpret_cast<HDROP>(wParam);
onDrop(drop);
} break;
case WM_ENTERSIZEMOVE:
{
SendDlgItemMessage(dialog, IDC_MAIN_MESSAGES, WM_CHATCONTROL, CHAT_CONTROL_STOP_RESIZING_MESSAGES, 0);
} break;
case WM_EXITSIZEMOVE:
{
SendDlgItemMessage(dialog, IDC_MAIN_MESSAGES, WM_CHATCONTROL_REPAINT, 0, 0);
SendDlgItemMessage(dialog, IDC_MAIN_MESSAGES, WM_CHATCONTROL, CHAT_CONTROL_START_RESIZING_MESSAGES, 0);
SendDlgItemMessage(dialog, IDC_MAIN_MESSAGES, WM_CHATCONTROL, CHAT_CONTROL_REDRAW, 0);
} break;
case WM_SIZE:
{
resizeChildWindows(LOWORD(lParam), HIWORD(lParam));

if (wParam == SIZE_RESTORED && maximized)
{
SendDlgItemMessage(dialog, IDC_MAIN_MESSAGES, WM_CHATCONTROL_REPAINT, 0, 0);
}

if (wParam == SIZE_MAXIMIZED)
{
maximized = true;
SendDlgItemMessage(dialog, IDC_MAIN_MESSAGES, WM_CHATCONTROL_REPAINT, 0, 0);
}
else
{
maximized = false;
}
} break;
case WM_GETMINMAXINFO:
{
Expand Down
1 change: 0 additions & 1 deletion source/Platforms/Win32/GUI/MainWindow.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@ class MainWindow
Settings &settings;
int sortingColumn;
SortingDirection sortingDirection;
bool maximized;

void openDatabase();
void openPlainDatabase(const std::string &filename);
Expand Down

0 comments on commit c17cc8d

Please sign in to comment.