📄 icontact.cpp
字号:
// iContact.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include "iContact.h"
#include "Settings.h"
#include "ListData.h"
#include "ListDataCallLog.h"
#include "ListDataPoom.h"
#include "GraphicFunctions.h"
#include "PhoneUtils.h"
#include "Titlebar.h"
//TODO: fix memory leak when updating contact pictures
//-----------------------------------------------------------------------------
// Global data
//
HINSTANCE hInst; // Program instance handle
Settings * pSettings = NULL;
ListData * pListData = NULL;
ScreenType stScreenType = stList;
int nCurrentTab = 2;
int ListHeight = 0;
int AverageItemHeight = DEFAULT_ITEM_HEIGHT;
int StartPosition[MAX_LIST_ITEMS];
int GroupPosition[ALPHABET_MAX_SIZE];
POINT ptMouseDown = { -1, -1 };
// Graphic
RECT rScreen;
int nScreenHeight;
RECT rTitlebar;
RECT rHeader;
RECT rMenubar;
RECT rList;
RECT rContent;
int rListHeight;
HFONT PrimaryListFont;
HFONT SecondaryListFont;
HFONT GroupFont;
HFONT ItemDetailsFont;
HFONT ListIndicatorFont;
HFONT KeyboardFont;
HDC hdcMem = NULL;
HBITMAP hbmMem = NULL;
HDC hdcTmp = NULL;
HBITMAP hbmTmp = NULL;
HDC hdcSkin = NULL;
HBITMAP hbmSkin = NULL;
HDC hdcPage1 = NULL;
HBITMAP hbmPage1 = NULL;
HDC hdcPage2 = NULL;
HBITMAP hbmPage2 = NULL;
// Scrolling
bool bDragging = false;
bool bScrolling = false;
int Scrolled = 0;
int ListScrolled = 0;
int LastX;
int LastY;
int tStartTime;
int tEndTime;
double Velocity = 0;
int nKeyRepeatCount = 0;
// Scroll To
DWORD Scroll_StartTime = 0;
double Scroll_TimeCounter = 0.0;
int Scroll_StartPosition = 0;
int Scroll_Change = 0;
double Scroll_Duration = 0.0;
// Screen Transition
DWORD dwTransitionStart = 0;
double dTransitionPct = 0.0;
int nTransitionDuration = 0;
bool bTransitioning = false;
TransitionType trTransitionType = ttSlideLeft;
// Popup window
bool bDisplayingPopup = false;
PopupType ptPopupType = ptKeyboard;
// Keyboard Rows/Columns
TCHAR alphabet[ALPHABET_MAX_SIZE];
int nKeyboardLetters = 26;
int nKeyboardRows = 0;
int nKeyboardCols = 0;
int GroupWidth = 0; // Keyboard group width
int GroupHeight = 0; // Keyboard group height
// Message dispatch table for MainWindowProc
const struct decodeUINT MainMessages[] = {
WM_PAINT, DoPaintMain,
WM_DESTROY, DoDestroyMain,
WM_ACTIVATE, DoActivate,
WM_SIZE, DoSize,
WM_LBUTTONDOWN, DoLButtonDown,
WM_MOUSEMOVE, DoMouseMove,
WM_LBUTTONUP, DoLButtonUp,
WM_TIMER, DoTimer,
WM_KEYDOWN, DoKeyDown,
WM_TITLEBAR, DoTitlebarCallback,
};
//=============================================================================
//
// Program entry point
//
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPWSTR lpCmdLine, int nCmdShow) {
MSG msg;
HWND hwndMain;
// Initialize this instance.
hwndMain = InitInstance(hInstance, lpCmdLine, nCmdShow);
if (hwndMain == 0)
return 0x10;
// Application message loop
while (GetMessage (&msg, NULL, 0, 0)) {
TranslateMessage (&msg);
DispatchMessage (&msg);
}
// Instance cleanup
return TermInstance (hInstance, msg.wParam);
}
//-----------------------------------------------------------------------------
// InitInstance - Instance initialization
//
HWND InitInstance (HINSTANCE hInstance, LPWSTR lpCmdLine, int nCmdShow){
WNDCLASS wc;
HWND hWnd;
// Save program instance handle in global variable.
hInst = hInstance;
#if defined(WIN32_PLATFORM_PSPC) || defined(WIN32_PLATFORM_WFSP)
// If Windows Mobile, allow only one instance of the application.
hWnd = FindWindow (SZ_APP_NAME, NULL);
if (hWnd) {
SetForegroundWindow ((HWND)(((DWORD)hWnd) | 0x01));
return 0;
}
#endif
// Register application main window class.
wc.style = 0; // Window style
wc.lpfnWndProc = MainWndProc; // Callback function
wc.cbClsExtra = 0; // Extra class data
wc.cbWndExtra = 0; // Extra window data
wc.hInstance = hInstance; // Owner handle
wc.hIcon = NULL; // Application icon
wc.hCursor = LoadCursor (NULL, IDC_ARROW);// Default cursor
wc.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH);
wc.lpszMenuName = NULL; // Menu name
wc.lpszClassName = SZ_APP_NAME; // Window class name
if (RegisterClass (&wc) == 0) return 0;
// Create main window.
hWnd = CreateWindowEx(WS_EX_NODRAG, // Ex Style
SZ_APP_NAME, // Window class
SZ_APP_NAME, // Window title
WS_SYSMENU, // Style flags
// don't use WS_VISIBLE.
// Why not? It causes an "error report"
// Why? I don't know.
CW_USEDEFAULT, // x position
CW_USEDEFAULT, // y position
CW_USEDEFAULT, // Initial width
CW_USEDEFAULT, // Initial height
NULL, // Parent
NULL, // Menu, must be null
hInstance, // Application instance
NULL); // Pointer to create
// parameters
// Return fail code if window not created.
if (!IsWindow (hWnd)) return 0;
// Initialize COM libraries (for POOM)
if (FAILED(CoInitializeEx(NULL, 0)))
return 0;
// Additional initialization
// Initialize titlebar callbacks
InitTitlebar(hWnd);
// Create fonts
PrimaryListFont = BuildFont(ITEM_FONT_SIZE, FALSE, FALSE);
SecondaryListFont = BuildFont(ITEM_SECONDARY_FONT_SIZE, TRUE, FALSE);
ItemDetailsFont = BuildFont(ITEM_DETAILS_FONT_SIZE, FALSE, FALSE);
GroupFont = BuildFont(GROUP_ITEM_FONT_SIZE, TRUE, FALSE);
ListIndicatorFont = BuildFont(LIST_INDICATOR_FONT_SIZE, TRUE, FALSE);
KeyboardFont = BuildFont(KEYBOARD_FONT_SIZE, TRUE, FALSE);
// Create data lists
pSettings = new Settings();
SwitchTab(hWnd, 2);
InitSurface(hWnd);
// Standard show and update calls
ShowWindow (hWnd, nCmdShow);
UpdateWindow (hWnd);
return hWnd;
}
//-----------------------------------------------------------------------------
// TermInstance - Program cleanup
//
int TermInstance (HINSTANCE hInstance, int nDefRC) {
return nDefRC;
}
//=============================================================================
// Message handling procedures for MainWindow
//
//-----------------------------------------------------------------------------
// MainWndProc - Callback function for application window
//
LRESULT CALLBACK MainWndProc (HWND hWnd, UINT wMsg, WPARAM wParam,
LPARAM lParam) {
INT i;
//
// Search message list to see if we need to handle this
// message. If in list, call procedure.
//
for (i = 0; i < dim(MainMessages); i++) {
if (wMsg == MainMessages[i].Code)
return (*MainMessages[i].Fxn)(hWnd, wMsg, wParam, lParam);
}
return DefWindowProc (hWnd, wMsg, wParam, lParam);
}
//-----------------------------------------------------------------------------
// DoPaintMain - Process WM_PAINT message for window.
//
LRESULT DoPaintMain (HWND hWnd, UINT wMsg, WPARAM wParam,
LPARAM lParam) {
PAINTSTRUCT ps;
RECT rect;
HDC hdc;
int rScreenWidth = rScreen.right - rScreen.left;
int rScreenHeight = rScreen.bottom - rScreen.top;
hdc = BeginPaint (hWnd, &ps);
// rect is the region that needs to be painted
rect = ps.rcPaint;
if (bTransitioning) {
RECT rContent = rScreen;
if (trTransitionType == ttSlideRight
|| trTransitionType == ttSlideLeft) {
rContent.top = rTitlebar.bottom;
int rHeight = rContent.bottom - rContent.top;
int width1 = (int)(rScreenWidth * dTransitionPct);
if (trTransitionType == ttSlideLeft)
width1 = rScreenWidth - width1;
int width2 = rScreenWidth - width1;
BitBlt(hdcMem, rContent.left, rContent.top, width1, rHeight,
hdcPage1, width2, rContent.top, SRCCOPY);
BitBlt(hdcMem, width1, rContent.top, width2, rHeight,
hdcPage2, rContent.left, rContent.top, SRCCOPY);
BitBlt(hdcMem, rTitlebar.left, rTitlebar.top,
rScreenWidth, rTitlebar.bottom - rTitlebar.top,
hdcPage1, rTitlebar.left, rTitlebar.top, SRCCOPY);
}
else if (trTransitionType == ttKeyboardExpand
|| trTransitionType == ttKeyboardShrink) {
double cubic = pow(dTransitionPct - 1, 3) + 1;
if (trTransitionType == ttKeyboardShrink)
cubic = 1 - cubic;
int nKbWidth = (int)(rScreenWidth * cubic);
int nKbHeight = (int)(rScreenHeight * cubic);
BitBlt(hdcMem, rScreen.left, rScreen.top,
rScreenWidth, rScreenHeight,
hdcPage1, rScreen.left, rScreen.top, SRCCOPY);
// for faster rendering, don't stretch or alpha-ize the keyboard
if (pSettings->doFastGraphics) {
BitBlt(hdcMem, rScreen.right - nKbWidth,
rScreen.bottom - nKbHeight, nKbWidth, nKbHeight,
hdcPage2, 0, 0, SRCCOPY);
}
else {
BltAlpha(hdcMem, rScreen.right - nKbWidth,
rScreen.bottom - nKbHeight, nKbWidth, nKbHeight,
hdcPage2, 0, 0, rScreenWidth, rScreenHeight, 220);
}
}
}
// not transitioning
else {
DrawScreenOn(hdcMem, stScreenType, hdcTmp, rect, Scrolled);
if (bDisplayingPopup) {
switch (ptPopupType) {
case ptKeyboard:
// draw the keyboard
DrawKeyboardOn(hdcTmp, rScreen);
BltAlpha(hdcMem, rScreen.left, rScreen.top, rScreenWidth, rScreenHeight,
hdcTmp, 0, 0, rScreenWidth, rScreenHeight, 220);
break;
}
}
}
// Transfer everything to the actual screen
BitBlt(hdc, rect.left, rect.top, rect.right - rect.left,
rect.bottom - rect.top, hdcMem, rect.left, rect.top, SRCCOPY);
EndPaint (hWnd, &ps);
return 0;
}
//-----------------------------------------------------------------------------
// DoActivate - Process WM_ACTIVATE message for window
//
LRESULT DoActivate (HWND hWnd, UINT wMsg, WPARAM wParam,
LPARAM lParam) {
DWORD dwState;
RECT rc;
if (wParam == WA_CLICKACTIVE || wParam == WA_ACTIVE) {
// To switch to full screen mode, first hide all of the shell parts.
dwState = (SHFS_HIDETASKBAR
| SHFS_HIDESTARTICON
| SHFS_HIDESIPBUTTON);
SHFullScreen(hWnd, dwState);
// Next resize the main window to the size of the screen.
SetRect(&rc, 0, 0, GetSystemMetrics(SM_CXSCREEN),
GetSystemMetrics(SM_CYSCREEN));
MoveWindow(hWnd, rc.left, rc.top, rc.right-rc.left,
rc.bottom-rc.top, TRUE);
ShowWindow(hWnd, SW_SHOWNORMAL);
}
// The window is being deactivated... restore it to non-fullscreen
else {
// To switch to normal mode, first show all of the shell parts.
dwState = (SHFS_SHOWTASKBAR
| SHFS_SHOWSTARTICON
| SHFS_SHOWSIPBUTTON);
SHFullScreen(hWnd, dwState);
// Next resize the main window to the size of the work area.
SystemParametersInfo(SPI_GETWORKAREA, 0, &rc, FALSE);
MoveWindow(hWnd, rc.left, rc.top, rc.right-rc.left,
rc.bottom-rc.top, TRUE);
}
return DefWindowProc (hWnd, wMsg, wParam, lParam);
}
//-----------------------------------------------------------------------------
// DoTitlebarCallback - Process WM_TITLEBAR message for window
//
LRESULT DoTitlebarCallback (HWND hWnd, UINT wMsg, WPARAM wParam,
LPARAM lParam) {
RefreshTitlebar(lParam);
InvalidateRect(hWnd, &rTitlebar, false);
return 0;
}
//-----------------------------------------------------------------------------
// DoSize - Process WM_SIZE message for window
//
LRESULT DoSize (HWND hWnd, UINT wMsg, WPARAM wParam,
LPARAM lParam) {
InitSurface(hWnd);
return DefWindowProc (hWnd, wMsg, wParam, lParam);
}
//-----------------------------------------------------------------------------
// DoLButtonDown - Process WM_LBUTTONDOWN message for window
//
LRESULT DoLButtonDown (HWND hWnd, UINT wMsg, WPARAM wParam,
LPARAM lParam) {
LastX = ptMouseDown.x = LOWORD(lParam);
LastY = ptMouseDown.y = HIWORD(lParam);
tStartTime = ::GetTickCount();
if (bScrolling) {
KillTimer(hWnd, IDT_TIMER_SCROLL);
KillTimer(hWnd, IDT_TIMER_SCROLL_TO);
Velocity = 0;
bScrolling = false;
}
if (bDisplayingPopup || bTransitioning) {
return 0;
}
if (stScreenType == stList
&& LastX > rList.right - 20
&& LastY >= rHeader.bottom
&& LastY < rMenubar.top) {
bScrolling = true;
ScrollBar(LastY);
InvalidateRect(hWnd, &rList, false);
UpdateWindow(hWnd);
}
return 0;
}
//-----------------------------------------------------------------------------
// DoMouseMove - Process WM_MOUSEMOVE message for window
//
LRESULT DoMouseMove (HWND hWnd, UINT wMsg, WPARAM wParam,
LPARAM lParam) {
int x = LOWORD(lParam);
int y = HIWORD(lParam);
int t = ::GetTickCount();
if (bDisplayingPopup || bTransitioning) {
return 0;
}
if (stScreenType == stList && ptMouseDown.y >= rMenubar.top) {
return 0;
}
if (ptMouseDown.y < rHeader.bottom) {
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -