mirror of
https://github.com/VincentWei/minigui-docs.git
synced 2025-10-18 09:21:35 +08:00
220 lines
5.2 KiB
C
220 lines
5.2 KiB
C
/*
|
|
** scrollview.c: Sample program for mGNCS Programming Guide
|
|
** The demo application for ScrollView.
|
|
**
|
|
** Copyright (C) 2009 ~ 2019 FMSoft Technologies.
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
// START_OF_INCS
|
|
#include <minigui/common.h>
|
|
#include <minigui/minigui.h>
|
|
#include <minigui/gdi.h>
|
|
#include <minigui/window.h>
|
|
|
|
#include <mgncs/mgncs.h>
|
|
// END_OF_INCS
|
|
|
|
#define IDC_SCROLLVIEW 100
|
|
|
|
static const char *people[] =
|
|
{
|
|
"cao cao",
|
|
"sun quan",
|
|
"liu bei",
|
|
"zhu ge liang",
|
|
"guan yu",
|
|
"pang tong",
|
|
"si ma yu",
|
|
};
|
|
|
|
static NCS_RDR_INFO rdr_info = {
|
|
"classic","classic",NULL
|
|
};
|
|
|
|
// START_OF_HANDLERS
|
|
static void scrlv_notify (mWidget *self, int id, int nc, DWORD add_data)
|
|
{
|
|
if (nc == NCSN_SCRLV_CLICKED)
|
|
{
|
|
if (self) {
|
|
const char* info;
|
|
mIconView *cls = (mIconView*)self;
|
|
|
|
info = (const char*)_c(cls)->getAddData(cls, (HITEM)add_data);
|
|
|
|
fprintf (stderr, "current item's data %s \n", info);
|
|
}
|
|
}
|
|
}
|
|
|
|
static NCS_EVENT_HANDLER scrlv_handlers[] = {
|
|
NCS_MAP_NOTIFY(NCSN_SCRLV_CLICKED, scrlv_notify),
|
|
{0, NULL }
|
|
};
|
|
// END_OF_HANDLERS
|
|
|
|
static NCS_WND_TEMPLATE _ctrl_tmpl[] = {
|
|
{
|
|
NCSCTRL_SCROLLVIEW,
|
|
IDC_SCROLLVIEW,
|
|
10, 10, 320, 150,
|
|
WS_BORDER | WS_VISIBLE | NCSS_NOTIFY | NCSS_SCRLV_SORT,
|
|
WS_EX_NONE,
|
|
"",
|
|
NULL,
|
|
&rdr_info,
|
|
scrlv_handlers,
|
|
NULL,
|
|
0,
|
|
0
|
|
},
|
|
};
|
|
|
|
static BOOL dialog_onKeyDown(mWidget* self,
|
|
int message, int code, DWORD key_status)
|
|
{
|
|
if (message == MSG_KEYDOWN) {
|
|
if (code == SCANCODE_REMOVE) {
|
|
mScrollView *scrlvObj;
|
|
int curSel, count;
|
|
HITEM delItem;
|
|
|
|
scrlvObj =
|
|
(mScrollView*)ncsObjFromHandle(GetDlgItem(self->hwnd, IDC_SCROLLVIEW));
|
|
count = _c(scrlvObj)->getItemCount(scrlvObj);
|
|
|
|
if (scrlvObj) {
|
|
curSel = _c(scrlvObj)->getCurSel(scrlvObj);
|
|
|
|
if (curSel >= 0) {
|
|
delItem = _c(scrlvObj)->getItem(scrlvObj, curSel);
|
|
_c(scrlvObj)->removeItem(scrlvObj, delItem);
|
|
if (curSel == count -1)
|
|
curSel--;
|
|
_c(scrlvObj)->setCurSel(scrlvObj, curSel);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
static NCS_EVENT_HANDLER dialog_handlers[] = {
|
|
{MSG_KEYDOWN, dialog_onKeyDown},
|
|
{0, NULL }
|
|
};
|
|
|
|
static NCS_MNWND_TEMPLATE dialog_tmpl = {
|
|
NCSCTRL_DIALOGBOX,
|
|
7,
|
|
0, 0, 350, 200,
|
|
WS_CAPTION | WS_BORDER | WS_VISIBLE,
|
|
WS_EX_NONE,
|
|
"ScrollView Demo",
|
|
NULL,
|
|
&rdr_info,
|
|
dialog_handlers,
|
|
_ctrl_tmpl,
|
|
sizeof(_ctrl_tmpl)/sizeof(NCS_WND_TEMPLATE),
|
|
0,
|
|
0, 0,
|
|
};
|
|
|
|
// START_OF_ITEMFUNCS
|
|
static int scrlv_cmp_item (mItemManager *manager, HITEM hItem1, HITEM hItem2)
|
|
{
|
|
mScrollView *scrlvObj = (mScrollView*)manager->obj;
|
|
const char *name1;
|
|
const char *name2;
|
|
|
|
if (scrlvObj) {
|
|
name1 = (const char*)_c(scrlvObj)->getAddData(scrlvObj, hItem1);
|
|
name2 = (const char*)_c(scrlvObj)->getAddData(scrlvObj, hItem2);
|
|
return strcmp (name1, name2);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
static void scrlv_draw_item (mItemView *self, HITEM hItem, HDC hdc, RECT *rcDraw)
|
|
{
|
|
const char *name = (const char*)_c(self)->getAddData(self, hItem);
|
|
gal_pixel oldBrushClr = 0, oldTextClr = 0;
|
|
BOOL isHilite = FALSE;
|
|
int top;
|
|
RECT rcText;
|
|
|
|
SetBkMode (hdc, BM_TRANSPARENT);
|
|
|
|
top = rcDraw->top;
|
|
if (_c(self)->indexOf(self, hItem) > 0) {
|
|
top --;
|
|
}
|
|
|
|
if (_c(self)->isHilight(self, hItem)) {
|
|
isHilite = TRUE;
|
|
oldBrushClr = SetBrushColor (hdc, PIXEL_blue);
|
|
FillBox (hdc, rcDraw->left + 1,
|
|
top + 1, RECTWP(rcDraw) - 2, RECTHP(rcDraw) - 1);
|
|
oldTextClr = SetTextColor (hdc, PIXEL_lightwhite);
|
|
}
|
|
|
|
Rectangle (hdc, rcDraw->left, top, rcDraw->right - 1, rcDraw->bottom - 1);
|
|
|
|
CopyRect(&rcText, rcDraw);
|
|
rcText.left += 5;
|
|
DrawText(hdc, name, -1, &rcText, DT_VCENTER | DT_SINGLELINE);
|
|
|
|
if (isHilite) {
|
|
SetBrushColor (hdc, oldBrushClr);
|
|
SetTextColor (hdc, oldTextClr);
|
|
}
|
|
}
|
|
// END_OF_ITEMFUNCS
|
|
|
|
static BOOL scrlv_init(mDialogBox* self)
|
|
{
|
|
int i;
|
|
HWND scrlvWnd;
|
|
mScrollView *scrlvObj;
|
|
NCS_SCRLV_ITEMINFO info;
|
|
|
|
scrlvWnd = GetDlgItem (self->hwnd, IDC_SCROLLVIEW);
|
|
scrlvObj = (mScrollView*)ncsObjFromHandle(scrlvWnd);
|
|
|
|
if (!scrlvObj)
|
|
return FALSE;
|
|
|
|
// START_OF_ADDITEMS
|
|
_c(scrlvObj)->freeze(scrlvObj, TRUE);
|
|
_c(scrlvObj)->setItemCmpFunc(scrlvObj, scrlv_cmp_item);
|
|
_c(scrlvObj)->setItemDraw(scrlvObj, scrlv_draw_item);
|
|
|
|
for (i = 0; i < TABLESIZE(people); i++) {
|
|
info.height = 32;
|
|
info.index = i;
|
|
info.addData = (DWORD)people[i];
|
|
_c(scrlvObj)->addItem(scrlvObj, &info, NULL);
|
|
}
|
|
_c(scrlvObj)->freeze(scrlvObj, FALSE);
|
|
// END_OF_ADDITEMS
|
|
return TRUE;
|
|
}
|
|
|
|
int MiniGUIMain(int argc, const char* argv[])
|
|
{
|
|
ncsInitialize();
|
|
mDialogBox* mydlg =
|
|
(mDialogBox *)ncsCreateMainWindowIndirect (&dialog_tmpl, HWND_DESKTOP);
|
|
|
|
scrlv_init(mydlg);
|
|
_c(mydlg)->doModal(mydlg, TRUE);
|
|
|
|
MainWindowThreadCleanup(mydlg->hwnd);
|
|
ncsUninitialize();
|
|
return 0;
|
|
}
|