首页 > 数据库 >SQLite3 客户端程序,Win32 SDK ,C/C++

SQLite3 客户端程序,Win32 SDK ,C/C++

时间:2023-05-23 14:22:05浏览次数:50  
标签:return HWND int hWnd Win32 IDM 客户端程序 SQLite3 define

1  WIn32 SDK 程序,尽量放在一个文件中,主要用到 Tree,ListView,Edit 控件。

2  把控件封装成类,但不封装窗口回调函数。类实例为全局变量,方便消息回调函数调用执行。这样做最简单。

3  Edit控件处理按键输入,模仿shell执行SQL查询

4 打开数据库文件时若没有此文件则新建,否则打开,打开后弹出密码对话框,确认则是wxSQLite3数据库吗,取消则是SQLite3数据库。

 

5 程序界面如下:

5.1  打开文件时根据密码选择是否是加密数据库

 5.2 打开后用sqlite_master表数据 在树中显示数据库结构

5.3  菜单常用命令,如查询,显示表结构等,控制台输入SQL命令。

 

实现如下:

1. 把 wxsqlite3-4.5.1.zip\wxsqlite3-4.5.1\sqlite3secure\src 整个目录复制到工程的工作目录。 (更高版本的wxsqlite3的结构不同)
2. 工程属性页配置VC++路径,include和source都加入wxsqlite3的路径
3. 把sqlite3.h和sqlite3secure.c加入工程,对sqlite3secure.c设置属性不使用预编译头,
4.工程属性页的c/c++ 预处理定义中增加wxsqlite3的开关
SQLITE_ENABLE_RTREE
SQLITE_ENABLE_COLUMN_METADATA
SQLITE_HAS_CODEC=1
SQLITE3ENCRYPT_EXPORTS
SQLITE_ENABLE_FTS3
SQLITE_ENABLE_FTS3_PARENTHESIS
SQLITE_SECURE_DELETE
SQLITE_SOUNDEX
CODEC_TYPE=CODEC_TYPE_AES256

Notes:wsSQLite3若用VC60编译要修改源文件,长整型LL要改为L, C++版本不同,所以最好用VS2010以上版编译

主程序:几个类写在同一个文件中

// SQLClient.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include "resource.h"

//xgz file 对话框
#include "commdlg.h"

//xgz 扩展控件用库
#include "Commctrl.h"
#pragma comment(lib,"comctl32.lib")

#include "wxSQLite.h"

class CApp
{
public:
    CApp();
    ~CApp();
public:

    HINSTANCE    m_hInst;
    HINSTANCE   m_hPrevInstance;
    HWND        m_hWnd;
    HWND        m_hWndClient;
    HACCEL        m_hAccelTable;
    HMENU        m_hMenu, m_hPopMenu;

    HWND        m_hStatusbar;
    HWND        m_hToolsbar;

    ATOM        MyRegisterClass(HINSTANCE hInstance, LPCSTR szWndClassName);
    BOOL        InitInstance(HINSTANCE hInstance, int nCmdShow);
    int            Run();

    HWND        CreateToolbar(HWND hWnd);
    HWND        CreateStatusbar(HWND hWnd);

public:
    TCHAR        m_File[1024];
    int            FileOpen();
};


class CEdit
{
public:
    CEdit();
    ~CEdit();

    HMENU        m_hMenu, m_hPopMenu;
    HINSTANCE    m_hInst;
    HWND        m_hWnd;

    HWND        Create(HWND hWndParent);
    int            Init();

    static LONG  OldWndProc;
    static LRESULT CALLBACK NewWndProc(HWND, UINT, WPARAM, LPARAM);

};

class CListView
{
public:
    CListView();
    ~CListView();

    HMENU        m_hMenu, m_hPopMenu;
    HINSTANCE    m_hInst;
    HWND        m_hWnd;

    HWND        Create(HWND hWndParent);
    int            Init();

public:
    int            Update(HWND hListView, int nrow, int ncol, char** pData);
    BOOL        GetItem(LVITEM* pItem);
};

class CTree
{
public:
    CTree();
    ~CTree();

    HMENU        m_hMenu, m_hPopMenu;
    HINSTANCE    m_hInst;
    HWND        m_hWnd;

    HWND        Create(HWND hWndParent);
    int            Init();

public:
    HTREEITEM    m_hRoot;

    HTREEITEM    AddItemToTree(HWND hwndTV, LPTSTR lpszItem, int nLevel);
    HTREEITEM    InsertTreeNode(HWND hWndTV, HTREEITEM hPrev, LPTSTR lpszItem);
    HTREEITEM   InsertItem(LPCTSTR lpszItem, int nImage, int nSelectedImage, HTREEITEM hParent = TVI_ROOT, HTREEITEM hInsertAfter = TVI_LAST);

    void        ExpandAll(HTREEITEM hItem);

    int        GetSelectionText(LPTSTR szText, int cchTextMax);

    int        OnLClkTree(LPNMHDR lphr);
    int        OnRClkTree(LPNMHDR lphr);
    int        OnDBLClkTree(LPNMHDR lphr);

    int     DeleteAllItem();

};

//把查询和显示封装在一起
class CSQL
{
public:
    CSQL();
    ~CSQL();

    CwxSQLite m_SQLite;
    TCHAR m_szDBName[256];
    int   m_iDBType;

    int    m_row;
    int    m_colum;

    int    Open(LPTSTR sql);
    int    Query(LPTSTR sql);
    int    PragmaTable(LPTSTR szTableName);
    int    DlgPassword();

};


// Global Variables:
CApp        theApp;
CTree        m_Tree1;
CEdit        m_Edit1;
CListView    m_ListView1;
CSQL        m_SQL1;


TCHAR        command[10000];
int            commandnum;
int            commandtype;
int            lastLength;

//=====================
TCHAR        szTitle[100] = _T("Main");
TCHAR        szWindowClass[100] = _T("XGZ_SQLClient_202305");

int m_SpltterLeft = 200;
int m_SpltterRight = 200;
int m_SpltterBottom = 200;
BOOL m_SpltterLeftMove = FALSE;
BOOL m_SpltterRightMove = FALSE;
BOOL m_SpltterBottomMove = FALSE;

RECT m_rtLeft;
RECT m_rtMain;
RECT m_rtBottom;


//==调试打印
int PRINT(const TCHAR* fmt, ...);
int RerAlign(HWND hWnd);

//==回调函数
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK    About(HWND, UINT, WPARAM, LPARAM);
BOOL  CALLBACK PasswordProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);

//==消息处理
int OnCreate(HWND, UINT, WPARAM, LPARAM);
int OnSize(HWND, UINT, WPARAM, LPARAM);
int OnPaint(HWND, UINT, WPARAM, LPARAM);
int OnTimer(HWND, UINT, WPARAM, LPARAM);
int OnNotify(HWND, UINT, WPARAM, LPARAM); //控件的通知是发给父窗口处理
int OnLButtonDown(HWND, UINT, WPARAM, LPARAM);
int OnLButtonUp(HWND, UINT, WPARAM, LPARAM);
int onm ouseMove(HWND, UINT, WPARAM, LPARAM);

//==菜单命令
int OnFileNew(HWND, UINT, WPARAM, LPARAM);
int OnFileOpen(HWND, UINT, WPARAM, LPARAM);
int OnFileSave(HWND, UINT, WPARAM, LPARAM);
int OnSelect100(HWND, UINT, WPARAM, LPARAM);
int OnSelectAll(HWND, UINT, WPARAM, LPARAM);
int OnPragma(HWND, UINT, WPARAM, LPARAM);
int OnPassword(HWND, UINT, WPARAM, LPARAM);

//== I/O 命令
int OnEditCommand(HWND, UINT, WPARAM, LPARAM);


//==main========
int APIENTRY WinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR     lpCmdLine,
    int       nCmdShow)
{
    theApp.InitInstance(hInstance, nCmdShow);
    theApp.Run();
    return 1;
}


//==类成员函数=========================
CApp::CApp()
{

}
CApp::~CApp()
{
    
}

ATOM CApp::MyRegisterClass(HINSTANCE hInstance, LPCSTR szWndClassName)
{
    WNDCLASSEX wcex;

    wcex.cbSize = sizeof(WNDCLASSEX);

    wcex.style = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc = (WNDPROC)WndProc;
    wcex.cbClsExtra = 0;
    wcex.cbWndExtra = 0;
    wcex.hInstance = hInstance;
    wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_ICON1);
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    wcex.lpszMenuName = MAKEINTRESOURCE(IDC_MAINMENU); //(LPCSTR)IDC_TREE;
    wcex.lpszClassName = szWndClassName;
    wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);

    return RegisterClassEx(&wcex);
}

BOOL CApp::InitInstance(HINSTANCE hInstance, int nCmdShow)
{
    HWND hWnd;

    //初始化全局变量
    command[0] = 0;
    commandnum = 0;
    commandtype = 0;

    m_hInst = hInstance;

    TCHAR szWndClassName[] = _T("wsSQLClient");

    MyRegisterClass(hInstance, szWndClassName);

    hWnd = CreateWindow(szWndClassName, _T("Main"), WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

    if (!hWnd)
    {
        return FALSE;
    }

    //m_hMenu = LoadMenu(m_hInst, MAKEINTRESOURCE(IDC_MAINMENU));// (LPCSTR)IDC_TREE);

    InitCommonControls();
    m_hToolsbar = CreateToolbar(hWnd);
    m_hStatusbar = CreateStatusbar(hWnd);

    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);

    return TRUE;
}

int CApp::Run()
{
    MSG msg;

    m_hAccelTable = LoadAccelerators(m_hInst, (LPCTSTR)IDC_SQLCLIENT);
    // Main message loop:
    while (GetMessage(&msg, NULL, 0, 0))
    {
        if (!TranslateAccelerator(m_hWnd, m_hAccelTable, &msg))
        {
            //if (hDlgModeless == NULL || !IsDialogMessage(hDlgModeless, &msg))
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
        }
    }

    return 0;
}

//========工具条和状态条==========================
HWND CApp::CreateStatusbar(HWND hWnd)
{
    int Rightend[3];
    RECT rt;

    GetClientRect(hWnd, &rt);

    HWND hWndStatusBar = CreateWindowEx(0, STATUSCLASSNAME, _T(""),
        WS_CHILD | WS_VISIBLE | SBS_SIZEGRIP,
        0, 0, 0, 0,
        hWnd,
        (HMENU)IDC_STATUSBAR,
        (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE),
        NULL);

    if (!hWndStatusBar)
        return NULL;

    Rightend[0] = rt.right / 2;
    Rightend[1] = rt.right * 3 / 4;
    Rightend[2] = rt.right;

    //set statusbar to three segment
    SendMessage(hWndStatusBar, SB_SETPARTS, (WPARAM)3, (LPARAM)Rightend);

    MoveWindow(hWndStatusBar, 0, 0, 0, 0, TRUE);

    //TextOut in statusbar
    SendMessage(hWndStatusBar, SB_SETTEXT, 0, (long)TEXT("Status 0"));
    SendMessage(hWndStatusBar, SB_SETTEXT, 1, (long)TEXT("========test====="));
    SendMessage(hWndStatusBar, SB_SETTEXT, 2, (long)TEXT("Step 2"));

    return hWndStatusBar;
}

HWND CApp::CreateToolbar(HWND hWnd)
{
    // image,COMMAND, STATUS, STYLE, //用系统标准图标
    TBBUTTON tbButton[] = {
        { STD_FILENEW,  IDM_FILE_NEW, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
        { STD_FILEOPEN, IDM_FILE_OPEN, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
        { STD_FILESAVE, IDM_TEST_TEST1, TBSTATE_ENABLED , TBSTYLE_BUTTON , 0L, 0},
        { STD_HELP, IDM_TEST_TEST3, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
        { 0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0L, -1},
        { STD_FIND, IDM_TEST_TEST3, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
        { STD_UNDO, IDM_TEST_TEST3, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
        { STD_REDOW, IDM_TEST_TEST3, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
        { 0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0L, -1},
        { STD_COPY, IDM_TEST_TEST3, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
        { STD_PASTE, IDM_TEST_TEST3, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
        { STD_CUT, IDM_TEST_TEST3, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
        { STD_DELETE, IDM_TEST_TEST3, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
        { STD_FILESAVE, IDM_TEST_TEST3, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
        { STD_PROPERTIES, IDM_TEST_TEST3, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
        { STD_FIND, IDM_TEST_TEST3, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
        { STD_REPLACE, IDM_TEST_TEST3, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
        { STD_PRINT, IDM_TEST_TEST3, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
        { STD_FILESAVE, IDM_TEST_TEST3, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
        { STD_FILESAVE, IDM_TEST_TEST3, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
        { STD_PRINTPRE, IDM_EXIT, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0}
    };


    HINSTANCE hLib = (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE); //It can be other DLL,here same as m_hInst

    HWND hWndToolbar = CreateWindowEx(0, TOOLBARCLASSNAME, _T(""),
        //WS_VISIBLE|WS_CHILD|TBSTYLE_TOOLTIPS,  //| WS_BORDER|TBSTYLE_FLAT,
        TBSTYLE_FLAT | WS_CHILD | WS_VISIBLE | TBSTYLE_TOOLTIPS | CCS_NORESIZE | CCS_ADJUSTABLE | CCS_NODIVIDER | CCS_NOPARENTALIGN, //for rebar 
        0, 0, 0, 0,
        hWnd, (HMENU)IDC_TOOLSBAR, (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE), NULL);

    if (!hWndToolbar)
        return NULL;

    SendMessage(hWndToolbar, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);
    SendMessage(hWndToolbar, TB_SETEXTENDEDSTYLE, 0, (LPARAM)(DWORD)(TBSTYLE_EX_DRAWDDARROWS));

    TBADDBITMAP tbBitmap1;
    tbBitmap1.hInst = HINST_COMMCTRL;
    tbBitmap1.nID = IDB_STD_SMALL_COLOR;
    SendMessage(hWndToolbar, TB_ADDBITMAP, 0, (LPARAM)&tbBitmap1);

    SendMessage(hWndToolbar, TB_SETBITMAPSIZE, 0, (LPARAM)MAKELONG(16, 16)); //size 16x16
    SendMessage(hWndToolbar, TB_AUTOSIZE, 0, 0);
    SendMessage(hWndToolbar, TB_ADDBUTTONS, 15, (LONG)&tbButton);   //add 6 button

    return hWndToolbar;
}

int CApp::FileOpen()
{
    TCHAR szFile[1024];       // buffer for file name
    HANDLE hf;              // file handle

    OPENFILENAME ofn;
    GetOpenFileName(&ofn);   // initialization data

    // Initialize OPENFILENAME
    ZeroMemory(&ofn, sizeof(ofn));
    ofn.lStructSize = sizeof(ofn);
    ofn.hwndOwner = m_hWnd;
    ofn.lpstrFile = szFile;
    // Set lpstrFile[0] to '\0' so that GetOpenFileName does not 
    // use the contents of szFile to initialize itself.
    ofn.lpstrFile[0] = '\0';
    ofn.nMaxFile = sizeof(szFile);
    ofn.lpstrFilter = _T("All\0*.*\0DataBase\0*.db\0");
    ofn.nFilterIndex = 2;  // the second type
    ofn.lpstrFileTitle = NULL;
    ofn.nMaxFileTitle = 0;
    ofn.lpstrInitialDir = NULL;
    //ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;  
    ofn.Flags = OFN_CREATEPROMPT;  //OFN_CREATEPROMPT  mean create a new file

    // Display the Open dialog box. 
    if (GetOpenFileName(&ofn) == TRUE)
    {
        lstrcpy(m_File, ofn.lpstrFile);
    }
    PRINT(_T("\r\n%s\r\n"), ofn.lpstrFile);

    return 1;
}

//==========================
CTree::CTree()
{
}
CTree::~CTree()
{
}

HWND CTree::Create(HWND hWndParent)
{
    InitCommonControls();

    m_hInst = (HINSTANCE)GetWindowLong(hWndParent, GWL_HINSTANCE);

    HWND hWndTreeView = CreateWindow(WC_TREEVIEW, _T("Tree"),
        WS_CHILD | WS_VISIBLE | TVS_HASBUTTONS | TVS_HASLINES | TVS_SHOWSELALWAYS | TVS_LINESATROOT | WS_BORDER | TVS_EDITLABELS,
        0, 0, 0, 0,
        hWndParent,
        (HMENU)IDC_TREE_FILE,
        m_hInst,
        NULL);

    HIMAGELIST hImageList;
    hImageList = ImageList_Create(16, 16, ILC_COLOR32 | ILC_MASK, 15, 15);             //size 16x16  X15 
    for (unsigned int i = 0; i < 15; i++)
    {
        HICON  hIcon = LoadIcon(m_hInst, MAKEINTRESOURCE(IDI_ICON1 + i));
        ImageList_AddIcon(hImageList, hIcon);
        DestroyIcon(hIcon);
    }
    SendMessage(hWndTreeView, TVM_SETIMAGELIST, 0, (LPARAM)hImageList);

    m_hWnd = hWndTreeView; //xgz 直接保存

    m_hMenu = LoadMenu(m_hInst, MAKEINTRESOURCE(IDC_MAINMENU));// (LPCSTR)IDC_TREE);
    m_hPopMenu = GetSubMenu(m_hMenu, 2);    //XGZ 用主菜单的第三列菜单作为弹出菜单

    return (hWndTreeView);

}

int CTree::Init()
{
    HTREEITEM hti;
    
    m_hRoot = InsertItem(_T("Root"), 10, 10);   //0,10
    //hti  = InsertItem(_T("Node1"), 0, 0, m_hRoot);
    //hti = InsertItem(_T("Node2"), 0, 0, m_hRoot, hti);

    //TreeView_Expand(m_hWnd, m_hRoot, TVE_EXPAND);//只展开一个节点
    ExpandAll(m_hRoot);   //递归展开所有节点
    
    return 1;
}

HTREEITEM  CTree::InsertItem(LPCTSTR lpszItem, int nImage, int nSelectedImage, HTREEITEM hParent, HTREEITEM hInsertAfter)
{
    TVINSERTSTRUCT tvins;
    TVITEM tvi;

    tvins.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM; //TVIF_TEXT| TVIF_PARAM; 
    tvins.item.pszText = (LPTSTR)lpszItem;
    tvins.item.iImage = nImage;          //初始图标都是文件 
    tvins.item.iSelectedImage = nSelectedImage;
    tvins.hParent = hParent;
    tvins.hInsertAfter = hInsertAfter;

    return (HTREEITEM)SendMessage(m_hWnd, TVM_INSERTITEM, 0, (LPARAM)(LPTVINSERTSTRUCT)&tvins);
}

//根据子节点确定图标,保存节点层数据,保存父节点句柄
HTREEITEM CTree::AddItemToTree(HWND hwndTV, LPTSTR lpszItem, int nLevel)
{
    TVITEM tvi;
    TVINSERTSTRUCT tvins;
    static HTREEITEM hPrev = (HTREEITEM)TVI_FIRST;
    static HTREEITEM hPrevRootItem = NULL;
    static HTREEITEM hPrevLev2Item = NULL;
    HTREEITEM hti;

    tvi.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM | TVIF_STATE;

    // Set the text of the item. 
    tvi.pszText = lpszItem;
    tvi.cchTextMax = sizeof(tvi.pszText) / sizeof(tvi.pszText[0]);

    // Assume the item is not a parent item, so give it a 
    // document image. 
    tvi.iImage = 0;// g_nDocument; 
    tvi.iSelectedImage = 0;// g_nDocument; 

    // Save the heading level in the item's application-defined 
    // data area. 
    tvi.lParam = (LPARAM)nLevel;
    tvins.item = tvi;
    tvins.hInsertAfter = hPrev;

    // Set the parent item based on the specified level. 
    if (nLevel == 1)
        tvins.hParent = TVI_ROOT;
    else if (nLevel == 2)
        tvins.hParent = hPrevRootItem;
    else
        tvins.hParent = hPrevLev2Item;

    // Add the item to the tree-view control. 
    hPrev = (HTREEITEM)SendMessage(hwndTV, TVM_INSERTITEM,
        0, (LPARAM)(LPTVINSERTSTRUCT)&tvins);

    if (hPrev == NULL)
        return NULL;

    // Save the handle to the item. 
    if (nLevel == 1)
        hPrevRootItem = hPrev;
    else if (nLevel == 2)
        hPrevLev2Item = hPrev;

    // The new item is a child item. Give the parent item a 
    // closed folder bitmap to indicate it now has child items. 
    if (nLevel > 1)
    {
        hti = TreeView_GetParent(hwndTV, hPrev);
        tvi.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE;
        tvi.hItem = hti;
        tvi.iImage = 2;//g_nClosed; 
        tvi.iSelectedImage = 2;// g_nClosed; 
        TreeView_SetItem(hwndTV, &tvi);
    }

    return hPrev;
}

HTREEITEM CTree::InsertTreeNode(HWND hWndTV, HTREEITEM hPrev, LPTSTR lpszItem)
{
    TVINSERTSTRUCT tvins;
    TVITEM tvi;

    tvins.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM; //TVIF_TEXT| TVIF_PARAM; 
    tvins.item.pszText = lpszItem;

    if (NULL != hPrev)   //把上级图标改为文件夹
    {
        tvi.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE;   //只处理 IMAGE
        tvi.hItem = hPrev;
        tvi.iImage = 10;
        tvi.iSelectedImage = 10;
        TreeView_SetItem(hWndTV, &tvi);
    }

    tvins.item.iImage = 0;          //初始图标都是文件 
    tvins.item.iSelectedImage = 0;

    tvins.hParent = hPrev;
    tvins.hInsertAfter = TVI_LAST;

    return (HTREEITEM)SendMessage(hWndTV, TVM_INSERTITEM, 0, (LPARAM)(LPTVINSERTSTRUCT)&tvins);
}

//递归展开
void CTree::ExpandAll(HTREEITEM hItem)
{
    if (!hItem)    return;

    HTREEITEM hChild = TreeView_GetChild(m_hWnd, hItem);

    ExpandAll(hChild);

    if (hChild) TreeView_Expand(m_hWnd, hItem, TVE_EXPAND);//XGZ 有子节点的展开父节点,上个返回可能是NULL

    HTREEITEM hSibling = TreeView_GetNextSibling(m_hWnd, hItem);

    ExpandAll(hSibling);
    //XGZ  sibling节点无需展开
    return;
}


int CTree::GetSelectionText(LPTSTR szText, int cchTextMax)
{
    TVITEM tvi;
    memset(&tvi, 0, sizeof(tvi));

    tvi.mask = TVIF_TEXT;// | TVIF_PARAM;
    tvi.hItem = TreeView_GetSelection(m_hWnd);
    tvi.pszText = szText;
    tvi.cchTextMax = cchTextMax;
    TreeView_GetItem(m_hWnd, &tvi);

    return 1;
}


int CTree::OnLClkTree(LPNMHDR lphr)
{
    TVHITTESTINFO thti;
    HTREEITEM htItem;
    TVITEM tvi;
    POINT point;

    GetCursorPos(&point);
    ScreenToClient(m_hWnd, &point);
    thti.pt = point;
    thti.flags = TVHT_TORIGHT;
    htItem = TreeView_HitTest(m_hWnd, &thti);

    if (htItem == NULL)
        return 0;

    TCHAR szText[20];
    memset(&tvi, 0, sizeof(tvi));
    tvi.mask = TVIF_TEXT | TVIF_PARAM;
    tvi.hItem = htItem;
    tvi.pszText = szText;
    tvi.cchTextMax = sizeof(szText);
    TreeView_GetItem(m_hWnd, &tvi);

    //PRINT(_T("\r\n<INFO>CTree::OnLClkTree= %s"), szText);

    return 1;
}
int CTree::OnRClkTree(LPNMHDR lphr)
{

    TVHITTESTINFO thti;
    HTREEITEM htItem;
    TVITEM tvi;
    POINT point;

    GetCursorPos(&point);
    ScreenToClient(m_hWnd, &point);
    thti.pt = point;
    thti.flags = TVHT_TORIGHT;
    htItem = TreeView_HitTest(m_hWnd, &thti);

    if (htItem == NULL)
        return 0;

    TCHAR szText[20];
    memset(&tvi, 0, sizeof(tvi));
    tvi.mask = TVIF_TEXT | TVIF_PARAM;
    tvi.hItem = htItem;
    tvi.pszText = szText;
    tvi.cchTextMax = sizeof(szText);
    TreeView_GetItem(m_hWnd, &tvi);

    //PRINT(_T("\r\n<INFO>CTree::OnRClkTree = %s"), szText);

    GetCursorPos(&point);

    TrackPopupMenu(m_hPopMenu, TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, 0, GetParent(m_hWnd), NULL);  //通知是控件的父窗口处理

    return 1;
}


int CTree::OnDBLClkTree(LPNMHDR lphr)
{
    HTREEITEM htItem;
    TVITEM tvi;
    htItem = TreeView_GetSelection(m_hWnd);

    if (htItem == NULL)
        return 0;

    //    HWND m_hWndClient = ((CXMDIFrameEx*)m_pMainFrame)->m_hWndClient;

    TCHAR szText[20];
    memset(&tvi, 0, sizeof(tvi));

    tvi.mask = TVIF_TEXT | TVIF_PARAM;
    tvi.hItem = htItem;
    tvi.pszText = szText;
    tvi.cchTextMax = sizeof(szText);

    TreeView_GetItem(m_hWnd, &tvi);

    //PRINT(_T("\r\n<INFO>CTree::OnDBLClkTree= %s"), szText);


    memset(&tvi, 0, sizeof(tvi));
    tvi.mask = TVIF_TEXT;
    tvi.hItem = TreeView_GetSelection(m_hWnd);
    tvi.pszText = szText;
    tvi.cchTextMax = sizeof(szText);
    TreeView_GetItem(m_hWnd, &tvi);

    int nrow, ncolum;

    wsprintf(command, _T("select * from %s limit 100;"), szText);

    commandnum = lstrlen(command);
    commandtype = 0;

    SendMessage(GetParent(m_hWnd), WM_COMMAND, (WPARAM)IDX_EDIT_COMMAND, (LPARAM)0);

    return 1;
}


int CTree::DeleteAllItem()
{

    HTREEITEM hItem = TreeView_GetRoot(m_hWnd);

    if (NULL == hItem)
    {
        return 0;
    }
    else
    {
        TreeView_DeleteItem(m_hWnd, hItem);
        return 1;
    }
}

//===================================

LONG  CEdit::OldWndProc = 0;

CEdit::CEdit()
{

}
CEdit::~CEdit()
{

}

HWND CEdit::Create(HWND hWndParent)
{

    m_hInst = (HINSTANCE)GetWindowLong(hWndParent, GWL_HINSTANCE);

    HWND hWndEdit = CreateWindow(TEXT("edit"), NULL,
        WS_CHILD | WS_BORDER | WS_VISIBLE | ES_MULTILINE | WS_VSCROLL,
        0, 0, 0, 0,
        hWndParent, (HMENU)IDC_LISTLOG, m_hInst, NULL);
    OldWndProc = SetWindowLong(hWndEdit, GWL_WNDPROC, (LONG)NewWndProc);

    m_hWnd = hWndEdit; //xgz 直接保存

    m_hMenu = LoadMenu(m_hInst, (LPCSTR)IDC_SQLCLIENT);
    m_hPopMenu = GetSubMenu(m_hMenu, 2);    //XGZ 用主菜单的第三列菜单作为弹出菜单

    return (hWndEdit);

}

int CEdit::Init()
{
    LOGFONT logfont;
    ZeroMemory(&logfont, sizeof(LOGFONT));
    //_tcscpy(logfont.lfFaceName, _T("tahoma"));
    logfont.lfCharSet = OEM_FIXED_FONT;
    logfont.lfHeight = 16;
    HFONT hFont = CreateFontIndirect(&logfont);
    SendMessage(m_hWnd, WM_SETFONT, (WPARAM)hFont, TRUE);

    PRINT(_T("SQL>"));

    return 1;
}


LRESULT CALLBACK CEdit::NewWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int iLength;
    int i;

    HANDLE hG;
    char* phG;

    int nowLength;
    int getLength;
    TCHAR selText[1000];

    switch (message)
    {
    case WM_CREATE:
        //不会执行
        break;
    case WM_DESTROY:
        return 0;
    case WM_KEYDOWN:
    {
        SetCaretPos(3, 3);
        iLength = GetWindowTextLength(hWnd);
        SendMessage(hWnd, EM_SETSEL, iLength, iLength);
        switch (wParam)
        {
        case VK_RETURN:
        {
            break;
        }
        case VK_ESCAPE:        //#define VK_ESCAPE         0x1B
            commandtype++;
            if (commandtype > 2)
            {
                commandtype = 0;
            }
            switch (commandtype)
            {
            case 0:
                PRINT("\r\nSQL>");
                break;
            case 1:
                PRINT("\r\nSYS>");
                break;
            case 2:
                PRINT("\r\nUSR>");
                break;
            default:
                PRINT("\r\nSQL>");
                break;
            }

            break;
        case VK_END:

            break;
        default:

            break;
        }
    }
    break;
    case WM_CHAR:
        switch (wParam)
        {
        case '\r':

            SendMessage(GetParent(hWnd), WM_COMMAND, (WPARAM)IDX_EDIT_COMMAND, (LPARAM)0);
            commandnum = 0;
            command[0] = 0;
            lastLength = GetWindowTextLength(hWnd);

            switch (commandtype)
            {
            case 0:
                PRINT("\r\nSQL>");
                break;
            case 1:
                PRINT("\r\nSYS>");
                break;
            case 2:
                PRINT("\r\nUSR>");
                break;
            default:
                PRINT("\r\nSQL>");
                break;
            }

            return TRUE;  //不处理return,把光标留在原位置
            break;
        case '\n':
            PRINT("case N");
            break;
        case 0x1b:
            //    PRINT("\r\nI reived ESCAPE - ESC");
            break;
        case '\b':
            command[commandnum] = 0;
            commandnum--;
            if (commandnum < 0)
            {
                commandnum = 0;
            }
            break;
        default:
            if (commandnum < 10000)
            {
                command[commandnum] = wParam;
                commandnum++;
                command[commandnum] = 0;
            }
            else
            {
                PRINT(_T("\r\n<FAIL> COMMAND OVERFLOW!"));
            }
            break;
        }
        SendMessage(GetParent(hWnd), message, wParam, lParam);
        break;
    case WM_PASTE:
        iLength = GetWindowTextLength(hWnd);
        SendMessage(hWnd, EM_SETSEL, iLength, iLength);
        OpenClipboard(hWnd);
        hG = GetClipboardData(CF_TEXT);
        phG = (char*)GlobalLock(hG);

        iLength = strlen(phG);
        if (iLength > 10000)
        {
            iLength = 10000;
        }


        for (i = 0; i < iLength; i++)
        {

            if (commandnum < 10000)
            {
                command[commandnum] = *(phG + i);
                commandnum++;
            }
            else
            {
                PRINT(_T("\r\n<FAIL> COMMAND OVERFLOW!"));
            }
        }

        command[commandnum] = 0;
        GlobalUnlock(hG);
        ///EmptyClipboard();  ////  empty after handled 
        CloseClipboard();
        //return TRUE;    /// no defalt paste
        break;
    default:
        break;

    }
    return CallWindowProc((WNDPROC)OldWndProc, hWnd, message, wParam, lParam);
}

//==========================================
CListView::CListView()
{
}
CListView::~CListView()
{
}

HWND CListView::Create(HWND hWndParent)
{
    InitCommonControls();

    m_hInst = (HINSTANCE)GetWindowLong(hWndParent, GWL_HINSTANCE);

    DWORD dwStyle;
    // Create the list-view window in report view with label editing enabled.
    dwStyle = WS_CHILD | WS_BORDER | WS_VISIBLE | LVS_REPORT | WS_TABSTOP; //|LVS_EDITLABELS; //|LVS_AUTOARRANGE
    HWND hWndListView = CreateWindow(WC_LISTVIEW, TEXT("ListTest"),
        dwStyle,
        0, 0,
        0, 0,
        hWndParent,
        (HMENU)IDC_LISTVIEW_VIEW,
        m_hInst,
        NULL);

    ListView_SetExtendedListViewStyle(hWndListView, LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);  //|LVS_EX_CHECKBOXES| LVS_EX_SUBITEMIMAGES

    HIMAGELIST hImageList;
    hImageList = ImageList_Create(16, 16, ILC_COLOR32 | ILC_MASK, 15, 15);             //size 16x16  X15 
    for (unsigned int i = 0; i < 15; i++)
    {
        HICON  hIcon = LoadIcon(m_hInst, MAKEINTRESOURCE(IDI_ICON1 + i));
        ImageList_AddIcon(hImageList, hIcon);
        DestroyIcon(hIcon);
    }
    SendMessage(hWndListView, TVM_SETIMAGELIST, 0, (LPARAM)hImageList);

    m_hWnd = hWndListView; //xgz 直接保存

    m_hMenu = LoadMenu(m_hInst, (LPCSTR)IDC_MAINMENU);
    m_hPopMenu = GetSubMenu(m_hMenu, 2);    //XGZ 用主菜单的第三列菜单作为弹出菜单

    return (hWndListView);
}

int CListView::Init()
{
    int i, j;
    int lvColumWidth[10] = { 70,70,70,50,50,50 };
    TCHAR* ColumName[10] =
    {
        _T("ID"),
        _T("Data"),
        NULL,
    };
    TCHAR* ItemData[10][10] =
    {
        //{_T("001"), _T("100"),},
        //{_T("002"), _T("101"),},
    };

    LV_COLUMN    lvColum;
    LVITEM        lvItem;
    //    HIMAGELIST    ImgList;

    lvColum.mask = LVCF_TEXT | LVCF_WIDTH; //|LVCF_SUBITEM;

    lvColum.cx = 80;

    for (i = 0; i < 3; i++)
    {
        lvColum.cx = lvColumWidth[i];
        lvColum.iSubItem = i;
        lvColum.pszText = ColumName[i];
        ListView_InsertColumn(m_hWnd, i, &lvColum);
    }


    ListView_SetItemCount(m_hWnd, 100); // for memory

    lvItem.mask = LVIF_TEXT;

    for (i = 0; i < 5; i++)
    {
        lvItem.iItem = i;
        lvItem.iSubItem = 0;
        lvItem.pszText = 0;  // first should have this or direct use data
        ListView_InsertItem(m_hWnd, &lvItem);  // for cell

        for (j = 0; j < 3; j++)
        {
            lvItem.iSubItem = j;
            lvItem.pszText = ItemData[i][j];
            ListView_SetItem(m_hWnd, &lvItem);  // for cell
        }
    }
    return 1;
}

int CListView::Update(HWND hListView, int nrow, int ncol, char** pData)
{
    int i, j;

    LV_COLUMN    lvColum;
    LVITEM        lvItem;
    HIMAGELIST    ImgList;

    SendMessage(hListView, LVM_DELETEALLITEMS, 0, 0);

    HWND hWndListViewHeader = (HWND)SendMessage(hListView, LVM_GETHEADER, 0, 0);

    int  nOldCols = SendMessage(hWndListViewHeader, HDM_GETITEMCOUNT, 0, 0);

    nOldCols--;

    for (; nOldCols >= 0; nOldCols--)
        SendMessage(hListView, LVM_DELETECOLUMN, nOldCols, 0);


    lvColum.mask = LVCF_TEXT | LVCF_WIDTH;//|LVCF_SUBITEM;

    lvColum.cx = 100;


    for (i = 0; i < ncol; i++)
    {
        lvColum.iSubItem = i;
        lvColum.pszText = pData[i];
        ListView_InsertColumn(hListView, i, &lvColum);
    }

    ListView_SetItemCount(hListView, 100); // for memory

    lvItem.mask = LVIF_TEXT;

    lvItem.pszText = 0;  // first should have this or direct use data

    for (i = 1; i < nrow + 1; i++)
    {
        lvItem.iItem = i - 1;
        lvItem.iSubItem = 0;
        ListView_InsertItem(hListView, &lvItem);  // for cell

        for (j = 0; j < ncol; j++)
        {
            lvItem.iSubItem = j;
            lvItem.pszText = pData[i * ncol + j];
            ListView_SetItem(hListView, &lvItem);  // for cell
        }

    }
    return 1;
}

//===============================
CSQL::CSQL()
{
}
CSQL::~CSQL()
{
}

int CSQL::Open(LPTSTR szFileName)
{
    lstrcpy(m_szDBName, szFileName);

    int nrow, ncolum;
    int i, j;

    HTREEITEM hItem;
    HTREEITEM hPItem;
    HTREEITEM hRoot;


    if (m_SQLite.m_IsOpen)
    {
        m_SQLite.Close();
    }

    if (!m_SQLite.Open(m_szDBName))
    {
        PRINT("<ERR> Open Failed");
        return -1;
    }

    DlgPassword();

    m_Tree1.DeleteAllItem();

    TCHAR* sql = _T("SELECT type,name,tbl_name,rootpage, sql FROM sqlite_master order by type");
    Query(sql);

    TCHAR ItemText[256];
    int levNow = 0;
    HTREEITEM  hParent = NULL;
    HTREEITEM  hCurrent = NULL;
    HTREEITEM  hDB = NULL;

    hRoot = m_Tree1.InsertTreeNode(m_Tree1.m_hWnd, NULL, _T("wxSQLite3"));
    hDB = m_Tree1.InsertTreeNode(m_Tree1.m_hWnd, hRoot, m_szDBName);

    ncolum = Header_GetItemCount(ListView_GetHeader(m_ListView1.m_hWnd));
    nrow = ListView_GetItemCount(m_ListView1.m_hWnd);

    char type_last[256] = "";
    char type[256];

    for (i = 0; i < nrow; i++)
    {
        ListView_GetItemText(m_ListView1.m_hWnd, i, 0, type, 255);//第一列
        if (0 != strcmp(type, type_last))
        {
            hParent = m_Tree1.InsertTreeNode(m_Tree1.m_hWnd, hDB, type);
            memset(type_last, 0, 256);
            memcpy(type_last, type, 255);
        }
        ListView_GetItemText(m_ListView1.m_hWnd, i, 1, ItemText, 255);
        hCurrent = m_Tree1.InsertTreeNode(m_Tree1.m_hWnd, hParent, ItemText);
    }
    SendMessage(m_Tree1.m_hWnd, TVM_EXPAND, TVE_EXPAND, (LPARAM)hRoot);
    //SendMessage(m_Tree1.m_hWnd, TVM_SETBKCOLOR, 0, RGB(255, 255, 230));  //RGB(200,230,150)
    m_Tree1.ExpandAll(hDB);

    return 1;
}


int CSQL::Query(LPTSTR sql)
{
    PRINT("\r\nSQL>%s", sql);
    m_SQLite.Query(sql, m_row, m_colum);
    m_ListView1.Update(m_ListView1.m_hWnd, m_row, m_colum, m_SQLite.m_sresult);
    PRINT("\r\nrow=%d,colum=%d", m_row, m_colum);

    return m_row;
}


int CSQL::DlgPassword()
{
    
    //HINSTANCE hInst = (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE);
    DialogBoxParam(theApp.m_hInst, (LPCTSTR)IDD_PASSWORDBOX, theApp.m_hWnd, (DLGPROC)PasswordProc, (LPARAM)&m_SQLite);
    return 1;
}


//=========================================

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
    TCHAR szHello[] = _T("Hello");

    switch (message)
    {
    case WM_CREATE:
        OnCreate(hWnd, message, wParam, lParam);
        break;
    case WM_SIZE:
        OnSize(hWnd, message, wParam, lParam);
        break;
    case WM_PAINT:
        OnPaint(hWnd, message, wParam, lParam);
        break;
    case WM_TIMER:
        OnTimer(hWnd, message, wParam, lParam);
        break;
    case WM_LBUTTONDOWN:
        OnLButtonDown(hWnd, message, wParam, lParam);
        break;
    case WM_LBUTTONUP:
        OnLButtonUp(hWnd, message, wParam, lParam);
        break;
    case WM_MOUSEMOVE:
        onm ouseMove(hWnd, message, wParam, lParam);
        break;
    case WM_NOTIFY: //XGZ  控件通知
        OnNotify(hWnd, message, wParam, lParam);
        break;
    case WM_COMMAND:
        wmId = LOWORD(wParam);
        wmEvent = HIWORD(wParam);
        // Parse the menu selections:
        switch (wmId)
        {
        case IDX_EDIT_COMMAND:
                OnEditCommand(hWnd, message, wParam, lParam);
            //PRINT("\r\n Command =%d, %s", theApp.commandnum, theApp.command);
            break;
        case IDM_FILE_NEW:
            OnFileNew(hWnd, message, wParam, lParam);
            break;
        case IDM_FILE_OPEN:
            OnFileOpen(hWnd, message, wParam, lParam);
            break;
        case IDM_FILE_SAVE:
            OnFileSave(hWnd, message, wParam, lParam);
            break;
        case IDM_DB_SELECT100:
            OnSelect100(hWnd, message, wParam, lParam);
            break;
        case IDM_DB_SELECTALL:
            OnSelectAll(hWnd, message, wParam, lParam);
            break;
        case IDM_DB_PRAGMA:
            OnPragma(hWnd, message, wParam, lParam);
            break;
        case IDM_DB_PASSWORD:
            OnPassword(hWnd, message, wParam, lParam);
            break;
            

        case IDM_TREE_EDIT:
            //            OnTreeEdit(hWnd, message, wParam, lParam);
            break;
        case IDM_TREE_INSERTCHILD:
            //            m_Tree1.InsertChild();
            break;
        case IDM_TREE_INSERTSIBLING:
            //            m_Tree1.InsertSibling();
            break;
        case IDM_TREE_DB_PRAGMA:
            OnPragma(hWnd, message, wParam, lParam);
            break;
        case IDM_ABOUT:
            //MessageBox(hWnd, "Test", "Test", MB_OK);
            DialogBox(theApp.m_hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
            break;
        case IDM_EXIT:
            DestroyWindow(hWnd);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        break;

    case WM_DESTROY:


        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}



int OnCreate(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    
    SetTimer(hWnd, 1, 10000, NULL);   //10s

    m_Tree1.Create(hWnd);
    m_Tree1.Init();

    m_ListView1.Create(hWnd);
    m_ListView1.Init();

    m_Edit1.Create(hWnd);
    m_Edit1.Init();
    
    return 1;
}



int RerAlign(HWND hWnd)
{
    int splitterwith = 4 / 2;
    int toolsbarhigh = 25;
    int statusbarhigh = 25;

    RECT rt;

    GetClientRect(hWnd, &rt);

    int cxClient = rt.right - rt.left;
    int cyClient = rt.bottom - rt.top;

    m_rtLeft.left = 0;
    m_rtLeft.right = m_SpltterLeft - splitterwith;
    m_rtLeft.top = toolsbarhigh; //toolsbar
    m_rtLeft.bottom = rt.bottom - statusbarhigh; //statusbar

    m_rtBottom.left = m_SpltterLeft + splitterwith;
    m_rtBottom.right = rt.right;
    m_rtBottom.top = rt.bottom - toolsbarhigh - m_SpltterBottom + splitterwith; //toolsbar
    m_rtBottom.bottom = rt.bottom - statusbarhigh;

    m_rtMain.left = m_SpltterLeft + splitterwith;
    m_rtMain.right = rt.right;
    m_rtMain.top = toolsbarhigh; //toolsbar
    m_rtMain.bottom = rt.bottom - statusbarhigh - m_SpltterBottom - splitterwith;  //statusbar

    MoveWindow(m_Tree1.m_hWnd, m_rtLeft.left, m_rtLeft.top, m_rtLeft.right - m_rtLeft.left, m_rtLeft.bottom - m_rtLeft.top, TRUE);
    MoveWindow(m_Edit1.m_hWnd, m_rtBottom.left, m_rtBottom.top, m_rtBottom.right - m_rtBottom.left, m_rtBottom.bottom - m_rtBottom.top, TRUE);
    MoveWindow(m_ListView1.m_hWnd, m_rtMain.left, m_rtMain.top, m_rtMain.right - m_rtMain.left, m_rtMain.bottom - m_rtMain.top, TRUE);
    return 1;
}

//留一个状态条的位置
int OnSize(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int cxClient, cyClient;

    cxClient = LOWORD(lParam);
    cyClient = HIWORD(lParam);

    MoveWindow(theApp.m_hToolsbar, 0, 0, cyClient, 25, TRUE);  //Toolsbar 25
    MoveWindow(theApp.m_hStatusbar, 0, 0, 0, 0, TRUE);         //Statusbar 25

    RerAlign(hWnd);

    return DefWindowProc(hWnd, message, wParam, lParam);

}

int OnPaint(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    PAINTSTRUCT ps;
    HDC hdc;
    RECT rt;

    hdc = BeginPaint(hWnd, &ps);
    GetClientRect(hWnd, &rt);
    //DrawText(hdc, StatusText, strlen(StatusText), &rt, DT_LEFT|DT_BOTTOM|DT_SINGLELINE);
    EndPaint(hWnd, &ps);

    return 1;
}

int OnTimer(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    return 1;
}


int OnEditCommand(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{

    int nrow = 0, ncolum = 0;

    if (commandnum == 0)
    {
        //PRINT("\r\n COMMMAND=0");
        return 0;
    }
    switch (commandtype)
    {
    case 0:
        m_SQL1.Query(command);
        break;
    case 1:
        PRINT("\r\n%s", command);
        break;
    case 2:
        PRINT("\r\nUSR>");
        break;
    default:
        PRINT("\r\nSQL>");
        break;
    }

    return 1;
}


int OnFileNew(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    PRINT("\r\nOnFileNew");
    return 1;
}


int OnFileOpen(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    theApp.FileOpen();
    m_SQL1.Open(theApp.m_File);

    return 1;
}

int OnFileSave(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    return 1;
}

int OnSelect100(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    HTREEITEM htItem;
    
    htItem = TreeView_GetSelection(m_Tree1.m_hWnd);

    if (htItem == NULL)
        return 0;
        

    TCHAR szText[256];
    m_Tree1.GetSelectionText(szText, 255);
        
    wsprintf(command, _T("select * from %s limit 100;"), szText);
        
    m_SQL1.Query(command);
    return 1;
}
int OnSelectAll(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    HTREEITEM htItem;

    htItem = TreeView_GetSelection(m_Tree1.m_hWnd);

    if (htItem == NULL)
        return 0;


    TCHAR szText[256];
    m_Tree1.GetSelectionText(szText, 255);

    wsprintf(command, _T("select * from %s;"), szText);
    m_SQL1.Query(command);

    return 1;
}
int OnPragma(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
        
    TCHAR szText[256];
    m_Tree1.GetSelectionText(szText,255);
    wsprintf(command, _T("PRAGMA table_info(%s);"), szText);
    m_SQL1.Query(command);
        

    return 1;
}

int OnPassword(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    m_SQL1.DlgPassword();
    return 1;
}

int OnTreeEdit(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    PRINT("\r\nOnTreeEdit");

    return 1;
}


int OnLButtonDown(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    RECT rt;

    GetClientRect(hWnd, &rt);

    int cxClient = rt.right - rt.left;
    int cyClient = rt.bottom - rt.top;

    int cxMouse = LOWORD(lParam);
    int cyMouse = HIWORD(lParam);

    if ((cxMouse - m_SpltterLeft > -5) && (cxMouse - m_SpltterLeft < 5))
    {
        SetCursor(LoadCursor(NULL, IDC_SIZEWE));
        SetCapture(hWnd);
        m_SpltterLeftMove = TRUE;
    }
    else if ((cyMouse - (cyClient - m_SpltterBottom - 25) > -5) && (cyMouse - (cyClient - m_SpltterBottom - 25) < 5) && (cxMouse > m_SpltterLeft + 5))
    {
        SetCursor(LoadCursor(NULL, IDC_SIZENS));
        SetCapture(hWnd);
        m_SpltterBottomMove = TRUE;
    }

    return 1;
}



int OnLButtonUp(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    if (m_SpltterBottomMove)
    {
        m_SpltterBottomMove = FALSE;
        ReleaseCapture();
    }
    if (m_SpltterLeftMove)
    {
        m_SpltterLeftMove = FALSE;
        ReleaseCapture();
    }

    return 1;
}

int onm ouseMove1(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{

    RECT rt;

    GetClientRect(hWnd, &rt);

    int cxClient = rt.right - rt.left;
    int cyClient = rt.bottom - rt.top;


    int cxMouse = LOWORD(lParam);
    int cyMouse = HIWORD(lParam);

    //在分割区
    if ((cxMouse - m_SpltterLeft > -5) && (cxMouse - m_SpltterLeft < 5))
    {
        SetCursor(LoadCursor(NULL, IDC_SIZEWE));
        SetCapture(hWnd);
    }
    else if ((cyMouse - (cyClient - m_SpltterBottom - 25) > -5) && (cyMouse - (cyClient - m_SpltterBottom - 25) < 5))
    {
        SetCursor(LoadCursor(NULL, IDC_SIZENS));
        SetCapture(hWnd);
    }
    else
    {
        ReleaseCapture();
    }

    
    //左右保留区
    if ((m_SpltterLeftMove) && (cxMouse > 50) && (cxMouse < (cxClient - m_SpltterRight) - 50))
    {
        m_SpltterLeft = cxMouse;

        SetCapture(hWnd);
        RerAlign(hWnd);
        //InvalidateRect(hWnd, NULL, TRUE); //会刷工具条

    }
    //上下保留区
    else if ((m_SpltterBottomMove) && (cyMouse > 100) && (cyMouse < cyClient - 50))
    {
        m_SpltterBottom = cyClient - cyMouse - 25;
        RerAlign(hWnd);
        SetCapture(hWnd);
        //InvalidateRect(hWnd, NULL, TRUE); //会刷工具条
    }

    else
    {
        //m_SpltterLeftMove = FALSE;
        //m_SpltterBottomMove = FALSE;
        //ReleaseCapture();
    }
    return 1;
}

int onm ouseMove(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    onm ouseMove1(hWnd, message, wParam, lParam);
    //    m_Tree1.OnMouseMove(hWnd, message, wParam, lParam);

    return 1;
}

int OnNotify(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{

    int idCtrl = (int)wParam;  //控件的 ID  
    LPNMHDR lphr = (LPNMHDR)lParam; //先看是哪个控件,再决定结构

    if (lphr->hwndFrom == m_Tree1.m_hWnd)
    {
        NM_TREEVIEW* pTree = (NM_TREEVIEW*)lParam; //是树控件,所以用树控件通知结构

        switch (pTree->hdr.code)
        {
        case NM_CLICK:
            m_Tree1.OnLClkTree(lphr);
            break;
        case NM_RCLICK:
            m_Tree1.OnRClkTree(lphr);
            break;
        case NM_DBLCLK:
            m_Tree1.OnDBLClkTree(lphr);
            break;
        
        default:
            //PRINT("\r\nm_hWndTree=%d  %d", m_hWndTree, pTree->hdr.code);
            break;
        }
    }

    return 0; //返回消息是给控件处理

}


// Mesage handler for about box.
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_INITDIALOG:
        return TRUE;

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return TRUE;
        }
        break;
    }
    return FALSE;
}


BOOL  CALLBACK PasswordProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    int i;

    static CwxSQLite SQLite, * pSQLite;

    TCHAR szPassWord[256];
    TCHAR szPassWordNew[256];
    TCHAR szPassWordNew2[256];

    
    switch (message)
    {
    case WM_INITDIALOG:
    
        RECT rtDesk;
        RECT rtDlg;
        GetWindowRect(GetDesktopWindow(), &rtDesk);
        GetWindowRect(hDlg, &rtDlg);
        
        SetWindowPos(hDlg, HWND_TOPMOST,
            rtDesk.right / 2 - rtDlg.right / 2,
            rtDesk.bottom / 2 - rtDlg.bottom / 2,
            rtDlg.right - rtDlg.left, rtDlg.bottom - rtDlg.top,
            SWP_NOOWNERZORDER | SWP_NOSIZE | SWP_NOZORDER);
        

        pSQLite = (CwxSQLite*)lParam;
        SQLite = *pSQLite;
        SetDlgItemText(hDlg, IDC_EDIT_OP1, _T("password"));

        return FALSE;
    case WM_COMMAND:
        switch (LOWORD(wParam))
        {
        case IDOK:

            GetDlgItemText(hDlg, IDC_EDIT_OP1, (LPTSTR)szPassWord, 256);
            GetDlgItemText(hDlg, IDC_EDIT_OP2, (LPTSTR)szPassWordNew, 256);
            GetDlgItemText(hDlg, IDC_EDIT_OP3, (LPTSTR)szPassWordNew2, 256);

            PRINT(szPassWord);
            PRINT(szPassWordNew);
            PRINT(szPassWordNew2);
            SQLite.SetPassWord(1, szPassWord, szPassWordNew);

            EndDialog(hDlg, TRUE);
            PRINT("\r\nIDOK");
            return TRUE;
        case IDCANCEL:
            EndDialog(hDlg, FALSE);
            PRINT("\r\nIDCANCEL");
            return TRUE;
        case IDRESET:
            EndDialog(hDlg, TRUE);
            PRINT("\r\nIDRESET");
            return TRUE;
        }
        break;

    }

    return FALSE;
}


int PRINT(const TCHAR* fmt, ...)
{
    TCHAR buffer[1024];

    va_list argptr;
    int cnt;

    int iEditTextLength;
    HWND hWnd = m_Edit1.m_hWnd;

    if (NULL == hWnd) return 0;

    va_start(argptr, fmt);
    cnt = wvsprintf(buffer, fmt, argptr);  // not %f

    va_end(argptr);

    iEditTextLength = GetWindowTextLength(hWnd);
    if (iEditTextLength + cnt > 30000)       // edit text max length is 30000
    {
        SendMessage(hWnd, EM_SETSEL, 0, 10000);
        SendMessage(hWnd, WM_CLEAR, 0, 0);
        iEditTextLength = iEditTextLength - 10000;
    }
    SendMessage(hWnd, EM_SETSEL, iEditTextLength, iEditTextLength);
    SendMessage(hWnd, EM_REPLACESEL, 0, (LPARAM)buffer);

    return(cnt);
}

 

其他文件:

#pragma once
#include "sqlite3.h"

class CwxSQLite
{
public:
    CwxSQLite(void);
    ~CwxSQLite(void);



public:
    sqlite3*    m_db;
    char**        m_sresult;
    BOOL        m_IsOpen;

public:
    BOOL    Open(char* filename);
    int        SetPassWord(int Mode, char* szPassWord, char* szPassWordNew);
    void    Close(); 
    BOOL    Query(char* sql, int &nrow, int &ncolum);
    BOOL    OnSqlExec(char* sql);
    static int sqlcallback(void* NotUsed, int argc, char** argv, char** azColName);
//xgz    int     ReadBLOB(char* sql, void* value); //xgz 读一个blob数据
    BOOL     SaveBLOB(char* sql, void* value, int len);

//xgz    int     ReadBlobRtf(char* sql, CString &str);//xgz 读一个blob数据
    //BOOL    InsertBLOB1(char* sql, void* value, int len);//xgz 插入一个blob数据
    BOOL    UpdateBLOB1(char* sql, void* value, int len);//xgz 更新一个blob数据

    BOOL    InsertBLOB(char* sql, int column_index, void* value, int len); //xgz 插入一个blob数据, 位置

};
#include "StdAfx.h"
#include "wxSQLite.h"

//#pragma comment(lib,"sqlite3.lib")

CwxSQLite::CwxSQLite(void)
{
    m_sresult = NULL;
    m_db = NULL;
    m_IsOpen = FALSE;
}


CwxSQLite::~CwxSQLite(void)
{
    if (NULL != m_sresult)
    {
        sqlite3_free_table(m_sresult);
        m_sresult = NULL;
    }

    if (NULL != m_db)
    {
        sqlite3_close(m_db);
        m_db = NULL;
    }

    m_IsOpen = FALSE;
}


BOOL CwxSQLite::Open(char* filename)
{
    int rc;

    if (NULL != m_db)
    {
        sqlite3_close(m_db);
        m_db = NULL;
        m_IsOpen = FALSE;
    }

    rc = sqlite3_open(filename, &m_db);
    if (rc)
    {
        sqlite3_close(m_db);
        return FALSE;
    }
    else
    {
        //m_IsOpen = TRUE;
    }
  
    m_IsOpen = TRUE;
    return TRUE;

}

int CwxSQLite::SetPassWord(int Mode, char* szPassWord, char* szPassWordNew)
{
    int rc;

    switch (Mode)
    {
    case 1: //SET 
        rc = sqlite3_key(m_db, szPassWord, 8); //使用密码,第一次为设置密码,以后为解密,最后是密码长度 
        break;
    case 2: //RESET
        rc = sqlite3_key(m_db, szPassWord, 8);
        rc = sqlite3_rekey(m_db, NULL, 0); //清空密码
        break;
    case 3: //CLEAR
        rc = sqlite3_key(m_db, szPassWord, 8);
        rc = sqlite3_rekey(m_db, szPassWordNew, 8); //RESET 
        break;
    default:
        break;
    }

    return 1;
}
void CwxSQLite::Close()
{
    if (NULL != m_db)
    {
        sqlite3_close(m_db);
        m_db = NULL;
    }

    m_IsOpen = FALSE;
}
//查询SQL
BOOL CwxSQLite::Query(char* sql, int& nrow, int& ncolum)
{
    char* szErrMsg;
    int rc;

    if (NULL != m_sresult)
    {
        sqlite3_free_table(m_sresult);
        m_sresult = NULL;
    }

    rc = sqlite3_get_table(m_db, sql, &m_sresult, &nrow, &ncolum, &szErrMsg);  /* execute SQL statement */
    if (rc != SQLITE_OK)
    {
        if (NULL != szErrMsg)
        {
            //PRINT(_T("\r\n<ERR>SQL error: %s\n"), szErrMsg);
            sqlite3_free(szErrMsg);
            return FALSE;
        }
        //PRINT(_T("\r\n<OK>select success!"));
    }

    return TRUE;
}

//sql执行回调函数
int  CwxSQLite::sqlcallback(void* NotUsed, int argc, char** argv, char** azColName)
{
    int i;
    for (i = 0; i < argc; i++)
    {
    }
    return 0;
}
//执行SQL
BOOL  CwxSQLite::OnSqlExec(char* sql)
{
    char* szErrMsg;
    int rc;
    rc = sqlite3_exec(m_db, sql, sqlcallback, 0, &szErrMsg);  /* execute SQL statement */
    if (rc != SQLITE_OK) 
    {
        sqlite3_free(szErrMsg);
        return FALSE;
    }

    return TRUE;
}
// xgz 只UPDATE一个数据,利用参数(:abc)传递 
//eg. char* sql = "UPDATE Table SET data = :abc  WHERE name = 'blob123';";
BOOL CwxSQLite::SaveBLOB(char* sql, void* value, int len)
{
    sqlite3_stmt* stmt = 0;
    //int index;
    int rc;
    const char* error = 0;
    //char* sql = "UPDATE TTestB SET data = :abc  WHERE name = 'blob123';";
    rc = sqlite3_prepare(m_db, sql, strlen(sql), &stmt, &error);
    if (rc != SQLITE_OK)
    {
        return FALSE;
    }

    rc = sqlite3_bind_blob(stmt, 1, (const void*)value, len, SQLITE_STATIC);

    rc = sqlite3_step(stmt);
    sqlite3_finalize(stmt);
    return TRUE;
}

BOOL CwxSQLite::InsertBLOB(char* sql, int column_index, void* value, int len)
{
    sqlite3_stmt* stmt = 0;
    //int index;
    int rc;
    const char* error = 0;

    rc = sqlite3_prepare(m_db, sql, strlen(sql), &stmt, &error);
    if (rc != SQLITE_OK)
    {
        return FALSE;
    }
    rc = sqlite3_bind_blob(stmt, column_index, (const void*)value, len, SQLITE_STATIC);

    rc = sqlite3_step(stmt);
    sqlite3_finalize(stmt);
    return TRUE;
}

//xgz
BOOL CwxSQLite::UpdateBLOB1(char* sql, void* value, int len)
{
    sqlite3_stmt* stmt = 0;
    //int index;
    int rc;
    const char* error = 0;

    rc = sqlite3_prepare(m_db, sql, strlen(sql), &stmt, &error);
    if (rc != SQLITE_OK)
    {
        return FALSE;
    }

    rc = sqlite3_bind_blob(stmt, 1, (const void*)value, len, SQLITE_STATIC);  //XGZ 只用第一个字段
    rc = sqlite3_step(stmt);
    sqlite3_finalize(stmt);
    return TRUE;
}

资源头文件

//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by SQLCLIENT.RC
//

//==程序相关
#define IDI_SQLCLIENT                    101
#define IDC_SQLCLIENT                    101


//==图标
#define IDI_ICON1                       131
#define IDI_ICON2                       132
#define IDI_ICON3                       133
#define IDI_ICON4                       134
#define IDI_ICON5                       135
#define IDI_ICON6                       136
#define IDI_ICON7                       137
#define IDI_ICON8                       138
#define IDI_ICON9                       139
#define IDI_ICON10                       140
#define IDI_ICON11                       141
#define IDI_ICON12                       142
#define IDI_ICON13                       143
#define IDI_ICON14                       144
#define IDI_ICON15                       145
#define IDI_ICON16                       146
#define IDI_ICON17                       147
#define IDI_ICON18                       148
#define IDI_ICON19                       149
#define IDI_ICON20                       150
//==菜单
#define IDC_MAINMENU                     201
//==对话框===== 
#define IDD_PASSWORDBOX                     210
#define IDD_ABOUTBOX                     211
//==控件=======
#define IDC_STATUSBAR                    1001
#define IDC_TOOLSBAR                    1002
#define IDC_LISTLOG                        1003 

#define IDC_TREE_FILE                    1101 
#define IDC_LISTVIEW_VIEW                1102 

#define IDC_EDIT_OP1                       1201
#define IDC_EDIT_OP2                       1202
#define IDC_EDIT_OP3                       1203
#define IDC_EDIT_OP4                       1204
#define IDRESET                            1205
#define ID_DLG_OPEN                        1206


//==菜单 COMMAND ID,
#define IDM_FILE_NEW                        40011
#define IDM_FILE_OPEN                        40012
#define IDM_FILE_SAVE                        40013
#define IDM_FILE_SAVEAS                        40014
#define IDM_TEST_TEST1                        40015
#define IDM_TEST_TEST2                        40016
#define IDM_TEST_TEST3                        40017
#define IDM_TEST_TEST4                        40018
#define IDM_TREE_EDIT                        40105
#define IDM_TREE_INSERTCHILD                40106
#define IDM_TREE_INSERTSIBLING                40107
#define IDM_TREE_ADD                        40108
#define IDM_TREE_DELETE                        40109
#define IDM_TREE_REFRESH                    40110
#define IDM_TREE_DB_CONNECT                    40119
#define IDM_TREE_DB_DISCONNECT                40120
#define IDM_TREE_DB_PRAGMA                    40121
#define IDM_DB_SELECT100                    40122
#define IDM_DB_PRAGMA                        40123
#define IDM_DB_SELECTALL                    40124
#define IDM_DB_PASSWORD                     40125

//==自定义消息 COMMAND ID
#define IDX_EDIT_COMMAND                      50001

//==默认框架
#define IDR_MAINFRAME                    128
#define IDD_NT2_DIALOG        102

#define IDS_APP_TITLE                    103
#define IDM_ABOUT                        104
#define IDM_EXIT                        105
#define IDS_HELLO                        106
#define IDI_SMALL                        108
#define IDC_MYICON                        2
#define IDC_STATIC                        -1

// Next default values for new objects
// 
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS

#define _APS_NEXT_RESOURCE_VALUE        129
#define _APS_NEXT_COMMAND_VALUE         32771
#define _APS_NEXT_CONTROL_VALUE         1000
#define _APS_NEXT_SYMED_VALUE           110
#endif
#endif

资源文件

//Microsoft Visual C++ generated resource script.
//

#include "resource.h"

#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#define APSTUDIO_HIDDEN_SYMBOLS
#include "windows.h"
#undef APSTUDIO_HIDDEN_SYMBOLS

/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
#ifdef _WIN32
LANGUAGE 4, 2
#pragma code_page(936)
#endif //_WIN32

/////////////////////////////////////////////////////////////////////////////
//
// Icon
//

// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.

IDI_SQLCLIENT       ICON    DISCARDABLE     "SQLClient.ICO"
IDI_SMALL               ICON    DISCARDABLE     "SMALL.ICO"


IDI_ICON1               ICON            ".\\Res\\Win95\\UtilityText.ico"
IDI_ICON2               ICON            ".\\Res\\Win95\\OPENFOLD.ico"
IDI_ICON3               ICON            ".\\Res\\Win95\\DISK06.ico"
IDI_ICON4               ICON            ".\\Res\\Win95\\DISKS04.ico"
IDI_ICON5               ICON            ".\\Res\\Win95\\EXPLORER.ico"
IDI_ICON6               ICON            ".\\Res\\Win95\\DRIVENET.ico"
IDI_ICON7               ICON            ".\\Res\\Win95\\DRIVEDSC.ico"
IDI_ICON8               ICON            ".\\Res\\Win95\\MYCOMP.ico"
IDI_ICON9               ICON            ".\\Res\\Win95\\NETHOOD.ico"
IDI_ICON10               ICON            ".\\Res\\Win95\\525FLOP1.ico"
IDI_ICON11               ICON            ".\\Res\\Win95\\CLSDFOLD.ico"
IDI_ICON12               ICON            ".\\Res\\Win95\\properties_wnd.ico"
IDI_ICON13               ICON            ".\\Res\\Win95\\undo.ico"
IDI_ICON14               ICON            ".\\Res\\Win95\\redo.ico"
IDI_ICON15               ICON            ".\\Res\\Win95\\DESKTOP.ico"

/////////////////////////////////////////////////////////////////////////////
//
// Menu
//

IDC_SQLCLIENT MENU DISCARDABLE
BEGIN
    POPUP "&File"
    BEGIN
        MENUITEM "E&xit",                IDM_EXIT
    END
    POPUP "&Help"
    BEGIN
        MENUITEM "&About ...",           IDM_ABOUT
    END
END


IDC_MAINMENU MENU DISCARDABLE
BEGIN
    POPUP "&File"
    BEGIN
        MENUITEM "&New", IDM_FILE_NEW
        MENUITEM "&Open", IDM_FILE_OPEN
        MENUITEM "&Save", IDM_FILE_SAVE
        MENUITEM "&Save As", IDM_FILE_SAVEAS
        MENUITEM "E&xit", IDM_EXIT
    END
    POPUP "&Test"
    BEGIN
        MENUITEM "&Test1", IDM_TEST_TEST1
        MENUITEM "&Test2", IDM_TEST_TEST2
        MENUITEM "&Test3", IDM_TEST_TEST3
        MENUITEM "&Test4", IDM_TEST_TEST4
    END
    POPUP "&DataBase"
    BEGIN
    MENUITEM "Select100", IDM_DB_SELECT100
    MENUITEM "Pragma", IDM_DB_PRAGMA
    MENUITEM "SelectAll", IDM_DB_SELECTALL
    MENUITEM "Password", IDM_DB_PASSWORD
    POPUP "Other"
    BEGIN
    MENUITEM "&Connect", IDM_TREE_DB_CONNECT
    MENUITEM "&Disconnect", IDM_TREE_DB_DISCONNECT
    MENUITEM "&Pragma", IDM_TREE_DB_PRAGMA
    END
    END
    POPUP "T&ree"
    BEGIN
        MENUITEM "&Edit", IDM_TREE_EDIT
        MENUITEM "&InsertChild", IDM_TREE_INSERTCHILD
        MENUITEM "&InsertSibling", IDM_TREE_INSERTSIBLING
        MENUITEM "&Delete", IDM_TREE_DELETE
        MENUITEM "&ReFresh", IDM_TREE_REFRESH
        POPUP "&DateBase"
        BEGIN
            MENUITEM "&Connect", IDM_TREE_DB_CONNECT
            MENUITEM "&Disconnect", IDM_TREE_DB_DISCONNECT
            MENUITEM "&Pragma", IDM_TREE_DB_PRAGMA
        END
    END
    POPUP "&Help"
    BEGIN
        MENUITEM "&About ...", IDM_ABOUT
    END
END


/////////////////////////////////////////////////////////////////////////////
//
// Accelerator
//

IDC_SQLCLIENT ACCELERATORS MOVEABLE PURE
BEGIN
    "?",            IDM_ABOUT,              ASCII,  ALT
    "/",            IDM_ABOUT,              ASCII,  ALT
END


/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//


IDD_PASSWORDBOX DIALOG DISCARDABLE  22, 17, 178, 128
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
CAPTION "PASSWORD"
FONT 8, "System"
BEGIN
    ICON            IDI_ICON1, IDCANCEL, 14, 9, 20, 20
    LTEXT           "XT Version 1.0", IDC_STATIC, 50, 7, 72, 8, SS_NOPREFIX
    LTEXT           "Copyright (C) 2023", IDC_STATIC, 49, 20, 119, 8
    DEFPUSHBUTTON   "OK", IDOK, 133, 44, 30, 11, WS_GROUP
    PUSHBUTTON      "CANCEL", IDCANCEL, 133, 68, 30, 11, WS_GROUP
    PUSHBUTTON      "RESET", IDRESET, 133, 92, 30, 11, WS_GROUP
    EDITTEXT        IDC_EDIT_OP1, 42, 42, 80, 14, ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_OP2, 42, 66, 80, 14, ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_OP3, 42, 90, 80, 14, ES_AUTOHSCROLL
END

IDD_ABOUTBOX DIALOG DISCARDABLE  22, 17, 230, 75
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
CAPTION "About"
FONT 8, "System"
BEGIN
    ICON            IDI_SQLCLIENT,IDC_MYICON,14,9,16,16
    LTEXT           "SQLClient Version 1.0",IDC_STATIC,49,10,119,8,SS_NOPREFIX
    LTEXT           "Copyright (C) 2023",IDC_STATIC,49,20,119,8
    DEFPUSHBUTTON   "OK",IDOK,195,6,30,11,WS_GROUP
END


#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//


2 TEXTINCLUDE DISCARDABLE 
BEGIN
    "#define APSTUDIO_HIDDEN_SYMBOLS\r\n"
    "#include ""windows.h""\r\n"
    "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n"
    "#include ""resource.h""\r\n"
    "\0"
END

3 TEXTINCLUDE DISCARDABLE 
BEGIN
    "\r\n"
    "\0"
END

#endif    // APSTUDIO_INVOKED




/////////////////////////////////////////////////////////////////////////////
//
// String Table
//

STRINGTABLE DISCARDABLE 
BEGIN
   IDC_SQLCLIENT   "SQLCLIENT"
   IDS_APP_TITLE       "SQLClient"
   IDS_HELLO           "Hello World!"
END

#endif
/////////////////////////////////////////////////////////////////////////////



#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//


/////////////////////////////////////////////////////////////////////////////
#endif    // not APSTUDIO_INVOKED

 

标签:return,HWND,int,hWnd,Win32,IDM,客户端程序,SQLite3,define
From: https://www.cnblogs.com/xgz21/p/17425067.html

相关文章

  • Missing binding E:\server\dovip\buyer-pc-web\node_modules\node-sass\vendor
    errorin./src/components/Search.vue?vue&type=style&index=0&id=7cb41050&scoped=true&lang=scss&SyntaxError:Error:MissingbindingE:\server\dovip\buyer-pc-web\node_modules\node-sass\vendor\win32-x64-83\binding.nodeNod......
  • Python数据库篇:sqlite3、mysql、sqlalchemy
    一:sqlite3importsqlite3conn=sqlite3.connect("test.db")cursor=conn.cursor()cursor.execute("createtableuser(idvarchar(20)primarykey,namevarchar(20))")cursor.execute("insertintouser(id,name)values(\'1\�......
  • Excel-win32com的宏操作
    importwin32com.clientxl=win32com.client.Dispatch("Excel.Application")#实例化Excel应用程序wb=xl.Workbooks.Open(r'C:\Users\Desktop\test1.xlsm')xl.Application.Run('test1.xlsm!模块1.getTime2("现在时刻")')wb.Save()xl.Appl......
  • SQLite3 to MySQL
    SQLite3toMySQLAsimplePythontooltotransferdatafromSQLite3toMySQL.Ioriginallywrotethissimpleprogramasastandalonescriptandpublisheditasa gist asananswertothis StackOverflowquestion.Sincethenquitesomepeoplehavetakeni......
  • Win32 SDK TreeView 控件的基本用法,节点的编辑,拖动,添加,删除,弹出菜单
    TreeView控件老是用的稀里糊涂的,写个测试程序总结一下基本用法要注意的是控件是发通知给父窗口处理,因此消息中鼠标的坐标不是相对控件的,要从屏幕坐标转换来。程序是WIN32SDK向导生成的C语言框架。树的操作定义成一个类。 微软网站上TreeView_XXX宏的说明文档好多错误,应该是......
  • Windows10下安装OpenSSL curl WIN32 /WIN64 openssl1.1.x
     首先是环境,强调下环境,很多问题是环境造成的。1.WINDOWS1064位系统;2.VisualStudio2015 工具: 1.ActivePerl-5.24.3.2404-MSWin32-x64-404865.exe,下载地址:https://www.activestate.com/products/activeperl/downloads/  2. openssl-1.1.0f.tar.gz  下载地址: h......
  • 使用Node.js调用Sqlite3模块写的大数据查询接口
    使用Node.js调用Sqlite3模块写的大数据查询接口constsqlite3=require('sqlite3');consthttp=require('http');consturl=require('url');constSqliteDb=async(dbFile)=>{constpri={};pri.db=newsqlite3.Database(dbFile);......
  • SQLite3数据库的介绍和使用(面向业务编程-数据库)
    SQLite3数据库的介绍和使用(面向业务编程-数据库)SQLite3介绍SQLite是一种用C语言实现的的SQL数据库它的特点有:轻量级、快速、独立、高可靠性、跨平台它广泛应用在全世界范围内的手机电脑应用的内建数据库官网地址:https://www.sqlite.org/index.htmlSQLite因为其采用文件存储......
  • python 读写sqlite3 读写内存中的数据库
    Python中,可以使用标准库sqlite3来读写SQLite数据库。下面是一个示例代码,展示如何连接到SQLite数据库,创建表格,插入数据,查询数据和关闭数据库:importsqlite3#连接到数据库conn=sqlite3.connect('example.db')#创建一个表格conn.execute('''CREATETABLEIFNOTE......
  • Python 基于win32com客户端实现Excel操作
    测试环境Python3.6.2代码实现非多线程场景下使用新建并保存EXCELimportwin32com.clientfromwin32apiimportRGBdefsave_something_to_excel(result_file_path):excel_app=win32com.client.Dispatch('Excel.Application')excel_app.Visible=False#设......