// test.cpp : 定义应用程序的入口点。
//
#include "stdafx.h"
#include "test.h"
#include <windows.h>
#include <commctrl.h>
#include <Winuser.h>
#define MAX_LOADSTRING 100
// 全局变量:
HINSTANCE g_hInst; // 当前实例
HWND g_hWndMenuBar; // 菜单栏句柄
HWND g_hListView; //ListView句柄
DWORD QVGA=0;
int iHeight=36;
// 此代码模块中包含的函数的前向声明:
ATOM MyRegisterClass(HINSTANCE, LPTSTR);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
#ifndef WIN32_PLATFORM_WFSP
//INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
LRESULT CreateListView(HWND hWndParent, CREATESTRUCT* lParam);//画主屏幕上的ListView控件
LRESULT OnListViewNotify(HWND hwnd, LPARAM lParam);
void OwnerDraw(LPDRAWITEMSTRUCT lpdis, HDC hdc, HWND hWnd);//在主屏幕上画List控件的item
#endif // !WIN32_PLATFORM_WFSP
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
// 执行应用程序初始化:
if (!InitInstance(hInstance, nCmdShow))
{
return FALSE;
}
#ifndef WIN32_PLATFORM_WFSP
HACCEL hAccelTable;
hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_TEST));
#endif // !WIN32_PLATFORM_WFSP
// 主消息循环:
while (GetMessage(&msg, NULL, 0, 0))
{
#ifndef WIN32_PLATFORM_WFSP
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
#endif // !WIN32_PLATFORM_WFSP
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int) msg.wParam;
}
//
// 函数: MyRegisterClass()
//
// 目的: 注册窗口类。
//
// 注释:
//
ATOM MyRegisterClass(HINSTANCE hInstance, LPTSTR szWindowClass)
{
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_TEST));
wc.hCursor = 0;
wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = 0;
wc.lpszClassName = szWindowClass;
return RegisterClass(&wc);
}
//
// 函数: InitInstance(HINSTANCE, int)
//
// 目的: 保存实例句柄并创建主窗口
//
// 注释:
//
// 在此函数中,我们在全局变量中保存实例句柄并
// 创建和显示主程序窗口。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
TCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本
TCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名
g_hInst = hInstance; // 将实例句柄存储在全局变量中
#if defined(WIN32_PLATFORM_PSPC) || defined(WIN32_PLATFORM_WFSP)
// 在应用程序初始化期间,应调用一次 SHInitExtraControls 以初始化
// 所有设备特定控件,例如,CAPEDIT 和 SIPPREF。
SHInitExtraControls();
#endif // WIN32_PLATFORM_PSPC || WIN32_PLATFORM_WFSP
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_TEST, szWindowClass, MAX_LOADSTRING);
#if defined(WIN32_PLATFORM_PSPC) || defined(WIN32_PLATFORM_WFSP)
//如果它已经在运行,则将焦点置于窗口上,然后退出
hWnd = FindWindow(szWindowClass, szTitle);
if (hWnd)
{
// 将焦点置于最前面的子窗口
// “| 0x00000001”用于将所有附属窗口置于前台并
// 激活这些窗口。
SetForegroundWindow((HWND)((ULONG) hWnd | 0x00000001));
return 0;
}
#endif // WIN32_PLATFORM_PSPC || WIN32_PLATFORM_WFSP
if (!MyRegisterClass(hInstance, szWindowClass))
{
return FALSE;
}
hWnd = CreateWindow(szWindowClass, szTitle, WS_VISIBLE,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
if (!hWnd)
{
return FALSE;
}
#ifdef WIN32_PLATFORM_PSPC
// 使用 CW_USEDEFAULT 创建主窗口时,将不会考虑菜单栏的高度(如果创建了一个
// 菜单栏)。因此,我们要在创建窗口后调整其大小
// 如果菜单栏存在
if (g_hWndMenuBar)
{
RECT rc;
RECT rcMenuBar;
GetWindowRect(hWnd, &rc);
GetWindowRect(g_hWndMenuBar, &rcMenuBar);
rc.bottom -= (rcMenuBar.bottom - rcMenuBar.top);
MoveWindow(hWnd, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, FALSE);
}
#endif // WIN32_PLATFORM_PSPC
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
//
// 函数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
// 目的: 处理主窗口的消息。
//
// WM_COMMAND - 处理应用程序菜单
// WM_PAINT - 绘制主窗口
// WM_DESTROY - 发送退出消息并返回
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
HRESULT lResult;
#if defined(SHELL_AYGSHELL) && !defined(WIN32_PLATFORM_WFSP)
static SHACTIVATEINFO s_sai;
#endif // SHELL_AYGSHELL && !WIN32_PLATFORM_WFSP
switch (message)
{
//监听主窗口上的ListView
case WM_NOTIFY:
if(ID_LISTVIEW == wParam)
{
lResult = OnListViewNotify(hWnd, lParam);
}
break;
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// 分析菜单选择:
switch (wmId)
{
#ifndef WIN32_PLATFORM_WFSP
case IDM_HELP_ABOUT:
//DialogBox(g_hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, About);
break;
#endif // !WIN32_PLATFORM_WFSP
#ifdef WIN32_PLATFORM_WFSP
case IDM_OK:
DestroyWindow(hWnd);
break;
#endif // WIN32_PLATFORM_WFSP
#ifdef WIN32_PLATFORM_PSPC
case IDM_OK:
SendMessage (hWnd, WM_CLOSE, 0, 0);
break;
#endif // WIN32_PLATFORM_PSPC
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_CREATE:
#ifdef SHELL_AYGSHELL
SHMENUBARINFO mbi;
memset(&mbi, 0, sizeof(SHMENUBARINFO));
mbi.cbSize = sizeof(SHMENUBARINFO);
mbi.hwndParent = hWnd;
mbi.nToolBarId = IDR_MENU;
mbi.hInstRes = g_hInst;
if (!SHCreateMenuBar(&mbi))
{
g_hWndMenuBar = NULL;
}
else
{
g_hWndMenuBar = mbi.hwndMB;
}
//判断屏幕分辨率,普通=1,VGA=2
if(GetSystemMetrics(SM_CXSCREEN) > 400)
{
QVGA =2;//VGA
}
else
{
QVGA=1;//普通
}
lResult = CreateListView(hWnd, (CREATESTRUCT*)lParam);//创建显示在主屏幕上的Listview
if(lResult != S_OK)
{
CommandBar_Destroy(g_hWndMenuBar);
PostQuitMessage(0);
}
#ifndef WIN32_PLATFORM_WFSP
// 初始化外壳程序激活信息结构
memset(&s_sai, 0, sizeof (s_sai));
s_sai.cbSize = sizeof (s_sai);
#endif // !WIN32_PLATFORM_WFSP
#endif // SHELL_AYGSHELL
break;
case WM_MEASUREITEM:
LPMEASUREITEMSTRUCT lpmi;
lpmi = (LPMEASUREITEMSTRUCT)lParam;
if (lpmi->CtlType == ODT_LISTVIEW)
{
switch(QVGA)
{
case 1:
iHeight = 36;
break;
case 2:
iHeight = 72;
break;
}
}
lpmi->itemHeight = iHeight;
break;
case WM_DRAWITEM: //custom drawing code for owner-draw listview control
//-------------------------------------画ListView控件-----------------------------------
LPDRAWITEMSTRUCT lpdis;
lpdis = (LPDRAWITEMSTRUCT)lParam;
OwnerDraw(lpdis, hdc, hWnd);
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: 在此添加任意绘图代码...
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
#ifdef SHELL_AYGSHELL
CommandBar_Destroy(g_hWndMenuBar);
#endif // SHELL_AYGSHELL
PostQuitMessage(0);
break;
#if defined(SHELL_AYGSHELL) && !defined(WIN32_PLATFORM_WFSP)
case WM_ACTIVATE:
// 向外壳程序通知我们的激活消息
SHHandleWMActivate(hWnd, wParam, lParam, &s_sai, FALSE);
break;
case WM_SETTINGCHANGE:
SHHandleWMSettingChange(hWnd, wParam, lParam, &s_sai);
break;
#endif // SHELL_AYGSHELL && !WIN32_PLATFORM_WFSP
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
//#ifndef WIN32_PLATFORM_WFSP
“关于”框的消息处理程序。
//INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
//{
// switch (message)
// {
// case WM_INITDIALOG:
//#ifdef SHELL_AYGSHELL
// {
// // 创建一个“完成”按钮并调整其大小。
// SHINITDLGINFO shidi;
// shidi.dwMask = SHIDIM_FLAGS;
// shidi.dwFlags = SHIDIF_DONEBUTTON | SHIDIF_SIPDOWN | SHIDIF_SIZEDLGFULLSCREEN | SHIDIF_EMPTYMENU;
// shidi.hDlg = hDlg;
// SHInitDialog(&shidi);
// }
//#endif // SHELL_AYGSHELL
//
// return (INT_PTR)TRUE;
//
// case WM_COMMAND:
//#ifdef SHELL_AYGSHELL
// if (LOWORD(wParam) == IDOK)
//#endif
// {
// EndDialog(hDlg, LOWORD(wParam));
// return (INT_PTR)TRUE;
// }
// break;
//
// case WM_CLOSE:
// EndDialog(hDlg, message);
// return (INT_PTR)TRUE;
//
//#ifdef _DEVICE_RESOLUTION_AWARE
// case WM_SIZE:
// {
// DRA::RelayoutDialog(
// g_hInst,
// hDlg,
// DRA::GetDisplayMode() != DRA::Portrait ? MAKEINTRESOURCE(IDD_ABOUTBOX_WIDE) : MAKEINTRESOURCE(IDD_ABOUTBOX));
// }
// break;
//#endif
// }
// return (INT_PTR)FALSE;
//}
//#endif // !WIN32_PLATFORM_WFSP
LRESULT CreateListView(HWND hWndParent, CREATESTRUCT* lParam)
{
RECT rcl; // rectangle for setting size of window
int index = 0; // index used in for loops
LV_COLUMN lvC; // list view column structure
TCHAR szText[MAX_PATH]; // place to store some text
memset(szText, '/0', sizeof(szText));
int iWid;
InitCommonControls();
// Get the size and position of the parent window.
GetClientRect(hWndParent, &rcl);
g_hListView = CreateWindow(WC_LISTVIEW, NULL,
WS_CHILD | WS_VISIBLE | LVS_REPORT | LVS_NOCOLUMNHEADER | LVS_OWNERDATA |LVS_OWNERDRAWFIXED | WS_BORDER,
rcl.left, rcl.top, rcl.right - rcl.left, rcl.bottom - rcl.top - 23,
hWndParent, (HMENU)ID_LISTVIEW, g_hInst,NULL);
if (g_hListView == NULL )
{
goto Error;
}
ListView_SetExtendedListViewStyle(g_hListView,
ListView_GetExtendedListViewStyle(g_hListView) | LVS_EX_FULLROWSELECT);
switch(QVGA)
{
case 1:
iWid = rcl.right - rcl.left - 14;
break;
case 2:
iWid = rcl.right - rcl.left - 28;
break;
}
lvC.mask = LVCF_FMT | LVCF_WIDTH | LVCF_SUBITEM;
lvC.fmt = LVCFMT_LEFT; // left-align column
// Add the columns.
lvC.iSubItem = 1;
lvC.cx = iWid;
if (ListView_InsertColumn(g_hListView, index, &lvC) == -1)
{
goto Error;
}
ListView_SetItemCount(g_hListView, 20);
return(0);
Error:
return(-1);
}
//程序主窗口上的选种功能
LRESULT OnListViewNotify(
HWND hwnd,
LPARAM lParam
)
{
NMHDR* pnmh = (NMHDR*) lParam;
LRESULT lResult = 0;
switch(pnmh->code)
{
case LVN_ITEMACTIVATE:
{
NMLISTVIEW* pnmlv = (NMLISTVIEW*)lParam;
int iItem = pnmlv->iItem;
MessageBox(hwnd, TEXT("You click the item"), TEXT("Note"), MB_OK);
}
break;
}
return(lResult);
}
//画主屏幕上的ListView控件的每一个item项
void OwnerDraw(LPDRAWITEMSTRUCT lpdis, HDC hdc, HWND hWnd)
{
//获得屏幕宽度
RECT rect;
GetClientRect(hWnd, &rect);
lpdis->rcItem.left = rect.left;
lpdis->rcItem.right = rect.right;
TCHAR tOrder[5];
int iTaskIndex;
if (lpdis->CtlType == ODT_LISTVIEW)
{
LPCTSTR lpszText = (LPCTSTR) lpdis->itemData;
hdc = lpdis->hDC;
// If this item is selected, set the background color
// and the text color to appropriate values. Also, erase
// rect by filling it with the background color.
HBRUSH hbrBkColor = CreateSolidBrush (RGB(255,255,255));
HBRUSH hbrSEL = CreateSolidBrush (RGB(155,197,255));
if ((lpdis->itemAction | ODA_SELECT) && (lpdis->itemState & ODS_SELECTED))
{
SetTextColor(hdc, RGB(0,0,0));
FillRect(hdc, &lpdis->rcItem,hbrSEL);
}
else
{
SetTextColor(hdc, RGB(0,0,0));
FillRect(hdc, &lpdis->rcItem,hbrBkColor);
}
DeleteObject (hbrSEL);
DeleteObject (hbrBkColor);
设置字体大小
//HFONT hfont;
//HFONT holdfont;
//LOGFONT logfont;
int iWid;
switch(QVGA)
{
case 1:
iWid = rect.right - rect.left - 14;
break;
case 2:
iWid = rect.right - rect.left - 28;
break;
}
//logfont.lfWidth=0;
//logfont.lfEscapement=0;
//logfont.lfOrientation=0;
logfont.lfWeight=400;
//logfont.lfItalic=false;
//logfont.lfUnderline=false;
//logfont.lfStrikeOut=false;
//logfont.lfCharSet=DEFAULT_CHARSET;
//logfont.lfOutPrecision=OUT_DEFAULT_PRECIS;
//logfont.lfClipPrecision=CLIP_DEFAULT_PRECIS;
//logfont.lfQuality=DEFAULT_QUALITY;
//logfont.lfPitchAndFamily=FF_DECORATIVE;
//logfont.lfFaceName;
//------------------------------------------------------------------------------//
//获得item索引
iTaskIndex = lpdis->itemID;
/*logfont.lfWeight=400;
hfont=CreateFontIndirect(&logfont);
holdfont=(HFONT)SelectObject(hdc,hfont);*/
//wsprintf(tOrder, TEXT("%d"),(iTaskIndex+1));
//lpdis->rcItem.left =0;
//lpdis->rcItem.right =iWid/9;
//DrawText(hdc, tOrder, lstrlen(tOrder),&lpdis->rcItem, DT_CENTER|DT_SINGLELINE|DT_BOTTOM);
//SelectObject(hdc,holdfont);
//------------------------------------------------------------------------------//
//Name
//画任务开始时间矩形
lpdis->rcItem.left =0;
lpdis->rcItem.right = iWid;
//lpdis->rcItem.top =iTaskIndex*iHeight;
lpdis->rcItem.bottom = lpdis->rcItem.top + iHeight/2;
/*logfont.lfWeight=400;
hfont=CreateFontIndirect(&logfont);
holdfont=(HFONT)SelectObject(hdc,hfont);*/
TCHAR tName[20];
memset(tName, '/0', 20);
lstrcpy(tName, TEXT("幸涌沛"));
int a=10;
a =DrawText(hdc, tName, lstrlen(tName),&lpdis->rcItem, DT_LEFT|DT_SINGLELINE|DT_BOTTOM);
//SelectObject(hdc,holdfont);
//------------------------------------------------------------------------------//
//Phone Number
lpdis->rcItem.left = 0;
lpdis->rcItem.right = iWid;
lpdis->rcItem.top =lpdis->rcItem.top + iHeight/2;
lpdis->rcItem.bottom = lpdis->rcItem.top + iHeight;
/*logfont.lfWeight=400;
hfont=CreateFontIndirect(&logfont);
holdfont=(HFONT)SelectObject(hdc,hfont);*/
TCHAR tNumber[20];
memset(tNumber, '/0', 20);
lstrcpy(tNumber, TEXT("15884557066"));
DrawText(hdc, tNumber, lstrlen(tNumber), &lpdis->rcItem, DT_LEFT|DT_SINGLELINE|DT_TOP);
//SelectObject(hdc,holdfont);
//DeleteObject(hfont);
//DeleteObject(holdfont);
//DeleteObject(dayBit);
//DeleteObject(olddayBit);
//DeleteDC(dayMemDC);
ReleaseDC (g_hListView, hdc);
}
}