您的位置:首页 > 产品设计 > UI/UE

【转】第一个MiniGUI程序:模仿QQ界面

2016-01-23 10:17 465 查看
最近几天在学MiniGui,最好的学习方法就是实践,先写个练练笔。
其实只是一个界面,不知道什么时候才能真正写个完整的程序。
初次写GUI程序,感觉写得不好,还请高手来指教。

//======================================================================//
//                             MiniQQ GUI ver 1.0                                                                                       //
//                     作者:YoYo Chan                                                                                                //
//                     Email: czy1000@126.com                                                                                   //
//                     Blog: http://hi.baidu.com/chenzhuoyou                                                              //
//                     MiniGUI版本: 1.3.3                                                                                            //
//==================================================================//
#include <stdio.h>
#include <minigui/common.h>
#include <minigui/minigui.h>
#include <minigui/gdi.h>
#include <minigui/window.h>
#include <minigui/control.h>
#ifndef _LITE_VERSION
#include <minigui/dti.c>
#endif
#define IDC_BUTTON0 100
#define IDC_BUTTON1 100+1
#define IDC_BUTTON2 100+2
#define IDC_BUTTON3 100+3
#define IDC_CHECKBOX0 110
#define IDC_CHECKBOX1 110+1
#define IDC_CHECKBOX2 110+2
#define IDC_TEXT0 120
#define IDC_TEXT1 120+1
#define IDC_TEXT2 120+2
#define IDC_TEXT3 120+3
#define IDC_TEXT4 120+4
#define IDC_EDIT0 130
#define IDC_EDIT1 130+1
#define IDC_EDIT2 130+2
#define IDC_EDIT3 130+3
#define IDC_EDIT4 130+4
#define IDC_LISTBOX0 140

//==========================Dialog代码开始==============================================================================//
static DLGTEMPLATE DlgInitProgress = {
  WS_BORDER | WS_CAPTION,
  WS_EX_NONE,
  0,0,320,240,
  "This is a dialog!",
  0,0,
  3,NULL,
  0
};

static CTRLDATA CtrlInitProgress[] =
{
  {
CTRL_STATIC,
WS_VISIBLE | SS_SIMPLE,
50,50,250,30,
IDC_TEXT4,
"欢迎到我的BLOG做客:",
0
  },
  {
CTRL_STATIC,
WS_VISIBLE | SS_SIMPLE,
50,80,250,30,
IDC_TEXT4,
"HTTP://HI.BAIDU.COM/CHENZHUOYOU",
0
  },
  {
CTRL_BUTTON,
WS_TABSTOP | WS_VISIBLE | BS_DEFPUSHBUTTON,
120,150,80,30,
IDOK,
"关闭",
0
  }
};

static int InitDialogBoxProc(HWND hDlg, int message, WPARAM wParam, LPARAM lParam)
{
  switch(message){
  case MSG_INITDIALOG:
    return 1;
  case MSG_COMMAND:
    switch(wParam){
    case IDOK:
      EndDialog(hDlg, wParam);
      break;
    }
    return 0;
  case MSG_CLOSE:
    EndDialog(hDlg, wParam);
    return 0;
  }
  return DefaultDialogProc(hDlg, message, wParam, lParam);
}

static int InitDialogBox(HWND hWnd)
{
  DlgInitProgress.controls = CtrlInitProgress;
  DialogBoxIndirectParam(&DlgInitProgress, hWnd, InitDialogBoxProc, 0L);
}
//=======================Dialog代码结束=======================================================================//

//========================Login代码开始=======================================================================//
int MiniGUIMain(int argc, const char* argv[])
{
  static int LoginWinProc();
  MSG Msg;
  HWND hMainWnd;
  MAINWINCREATE CreateInfo;

  #ifdef _LITE_VERSION
  SetDesktopRect( 0, 0, 800, 600);
  #endif

  char *p = "这是YoYo的第一个MiniGUI程序!";
  CreateInfo.dwStyle = WS_VISIBLE | WS_BORDER | WS_CAPTION;
  CreateInfo.dwExStyle = WS_EX_NONE;
  CreateInfo.spCaption = "MiniQQ ver0.1      Author: YoYo Chan";
  CreateInfo.hMenu = 0;
  CreateInfo.hCursor = GetSystemCursor(0);
  CreateInfo.hIcon = 0;
  CreateInfo.MainWindowProc = LoginWinProc;
  CreateInfo.lx = 0;
  CreateInfo.ty = 0;
  CreateInfo.rx = 320;
  CreateInfo.by = 240;
  CreateInfo.iBkColor = COLOR_lightwhite;
  CreateInfo.dwAddData = p;
  CreateInfo.hHosting = HWND_DESKTOP;

  hMainWnd = CreateMainWindow(&CreateInfo);
  if(hMainWnd==HWND_INVALID)
return -1;

  ShowWindow(hMainWnd, SW_SHOWNORMAL);
  while(GetMessage(&Msg, hMainWnd)){
    TranslateMessage(&Msg);
    DispatchMessage(&Msg);
  }

  MainWindowThreadCleanup(hMainWnd);
  printf("The MainWin has been close!\n");
  return 0;
}

static int LoginWinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
{
  static int QQWin();
  char *str1 = (char *)GetWindowAdditionalData(hWnd);
  switch(message){
  case MSG_CREATE:
    CreateWindow(CTRL_STATIC,
            str1,
            WS_CHILD | WS_VISIBLE,
            IDC_TEXT0,
            10,10,220,20,hWnd,0);

    CreateWindow(CTRL_STATIC,
            "用户名:",
            WS_CHILD | WS_VISIBLE,
            IDC_TEXT1,
            50,50,80,20,hWnd,0);

    CreateWindow(CTRL_EDIT,
            "User Name",
            WS_CHILD | WS_BORDER | WS_VISIBLE,
            IDC_EDIT0,
            130,50,100,20,hWnd,0);

    CreateWindow(CTRL_STATIC,
            "密码:",
            WS_CHILD | WS_VISIBLE,
            IDC_TEXT2,
            50,80,80,20,hWnd,0);

    CreateWindow(CTRL_EDIT,
            "Password",
            WS_CHILD | WS_BORDER | WS_VISIBLE | ES_PASSWORD,
            IDC_EDIT1,
            130,80,100,20,hWnd,0);

    CreateWindow(CTRL_BUTTON,
            "登陆",
            WS_CHILD | BS_DEFPUSHBUTTON | WS_VISIBLE,
            IDC_BUTTON0,
            100,160,80,30,hWnd,0);

    CreateWindow(CTRL_BUTTON,
            "保存密码",
            WS_CHILD | BS_AUTOCHECKBOX | WS_VISIBLE,
            IDC_CHECKBOX0,
            50,120,100,30,hWnd,0);

    CreateWindow(CTRL_BUTTON,
            "隐身登陆",
            WS_CHILD | BS_AUTOCHECKBOX | WS_VISIBLE,
            IDC_CHECKBOX1,
            180,120,100,30,hWnd,0);
    printf("The MainWin has been opened!\n");
    return 0;
  case MSG_COMMAND:{
    int id = LOWORD(wParam);
    int code = HIWORD(wParam);
    switch(id){
    case IDC_BUTTON0:
      if(code == BN_CLICKED){
        SendMessage(hWnd, MSG_CLOSE, 0, 0);
        QQWin();
      }
    }
    return 0;
  }
  case MSG_DESTROY:
    DestroyAllControls(hWnd);
    return 0;
  case MSG_CLOSE:
    DestroyMainWindow(hWnd);
    PostQuitMessage(hWnd);
    return 0;
  }

  return DefaultMainWinProc(hWnd, message, wParam, lParam);
}
//=========================Login代码结束==========================================================================================//

//=========================QQ主面板代码开始=========================================================================================//
static int QQWin(void)
{
  static int QQWinProc();
  MSG Msg;
  HWND hQQWnd;
  MAINWINCREATE CreateInfo;
  CreateInfo.dwStyle = WS_VISIBLE | WS_BORDER | WS_CAPTION;
  CreateInfo.dwExStyle = WS_EX_NONE;
  CreateInfo.spCaption = "MiniQQ ver0.1";
  CreateInfo.hMenu = 0;
  CreateInfo.hCursor = GetSystemCursor(0);
  CreateInfo.hIcon = 0;
  CreateInfo.MainWindowProc = QQWinProc;
  CreateInfo.lx = 0;
  CreateInfo.ty = 0;
  CreateInfo.rx = 180;
  CreateInfo.by = 450;
  CreateInfo.iBkColor = COLOR_lightwhite;
  CreateInfo.dwAddData = 0;
  CreateInfo.hHosting = HWND_DESKTOP;

  hQQWnd = CreateMainWindow(&CreateInfo);
  if(hQQWnd==HWND_INVALID)
    return -1;
  ShowWindow(hQQWnd, SW_SHOWNORMAL);
  while(GetMessage(&Msg, hQQWnd)){
    TranslateMessage(&Msg);
    DispatchMessage(&Msg);
  }
  MainWindowThreadCleanup(hQQWnd);
  printf("The QQWin has been closed!\n");
  return 0;
}

static int QQWinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
{
  static int MessageWin();
  static HWND hListBox;
  switch(message){
  case MSG_CREATE:{
    HWND hListBox;
    hListBox = CreateWindow(CTRL_LISTBOX,
                  "FriendsList",
                  WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | LBS_SORT | LBS_NOTIFY | LBS_USEICON,
                  IDC_LISTBOX0,
                  10,10,160,350,hWnd,0);
    LISTBOXITEMINFO lbii;
    lbii.hIcon = GetSmallSystemIcon(4);
    lbii.cmFlag = CMFLAG_BLANK;
    lbii.string = "YoYo Chan";
    SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)&lbii);
    CreateWindow(CTRL_BUTTON,
            "点击我",
            WS_CHILD | WS_VISIBLE,
            IDC_BUTTON3,
            10,370,160,30,hWnd,0);
    printf("The QQWin has been opened!\n");
    return 0;
  }

  case MSG_COMMAND:{
    int id = LOWORD(wParam);
    int code = HIWORD(wParam);
    switch(id){
    case IDC_LISTBOX0:
      if(code == LBN_DBLCLK){
        hListBox = GetDlgItem(hWnd, IDC_LISTBOX0);
        int index;
        char buffer[20];
        index = SendMessage(hListBox, LB_GETCURSEL, 0, 0);
        SendMessage(hListBox, LB_GETTEXT, index, (LPARAM)buffer);
        MessageWin(hWnd, (char *)buffer);
      }
    case IDC_BUTTON3:
      if(code == BN_CLICKED)
        InitDialogBox(hWnd);
    }
    return 0;
  }
  case MSG_DESTROY:
    DestroyAllControls(hWnd);
    return 0;
  case MSG_CLOSE:
    DestroyMainWindow(hWnd);
    PostQuitMessage(hWnd);
    return 0;
  }

  return DefaultMainWinProc(hWnd, message, wParam, lParam);
}
//======================QQ主面板代码结束====================================================================================//

//=====================消息对话框代码开始=====================================================================================//
static int MessageWin(HWND hWnd, char* friendName)
{
  static int MessageWinProc();
  HWND hMsgWnd;
  MAINWINCREATE CreateInfo;
  CreateInfo.dwStyle = WS_VISIBLE | WS_BORDER | WS_CAPTION;
  CreateInfo.dwExStyle = WS_EX_NONE;
  CreateInfo.spCaption = friendName;
  CreateInfo.hMenu = 0;
  CreateInfo.hCursor = GetSystemCursor(0);
  CreateInfo.hIcon = 0;
  CreateInfo.MainWindowProc = MessageWinProc;
  CreateInfo.lx = 0;
  CreateInfo.ty = 0;
  CreateInfo.rx = 450;
  CreateInfo.by = 350;
  CreateInfo.iBkColor = COLOR_lightwhite;
  CreateInfo.dwAddData = 0;
  CreateInfo.hHosting = hWnd;

  hMsgWnd = CreateMainWindow(&CreateInfo);
  if(hMsgWnd==HWND_INVALID)
    return -1;

  ShowWindow(hMsgWnd, SW_SHOWNORMAL);
  return 0;
}

static int MessageWinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
{
  static int MessageSendProc();
  switch(message){
  case MSG_CREATE:
    CreateWindow(CTRL_MLEDIT,
            "",
            WS_CHILD | WS_BORDER | WS_VISIBLE | ES_AUTOWRAP | WS_VSCROLL,
            IDC_EDIT2,
            10,10,350,200,hWnd,0);

    SendMessage(GetDlgItem(hWnd, IDC_EDIT2), EM_SETREADONLY, TRUE, 0);

    CreateWindow(CTRL_EDIT,
            "",
            WS_CHILD | WS_BORDER | WS_VISIBLE | WS_TABSTOP | ES_AUTOWRAP,
            IDC_EDIT3,
            10,220,350,100,hWnd,0);

    CreateWindow(CTRL_BUTTON,
            "发送",
            WS_CHILD | WS_VISIBLE,
            IDC_BUTTON1,
            370,220,70,45,hWnd,0);

    CreateWindow(CTRL_BUTTON,
            "关闭",
            WS_CHILD | WS_VISIBLE,
            IDC_BUTTON2,
            370,275,70,45,hWnd,0);

    SetNotificationCallback(GetDlgItem(hWnd, IDC_BUTTON1), MessageSendProc);
    printf("The MessageWin has been opened!\n");
    return 0;
  case MSG_COMMAND:{
    int id = LOWORD(wParam);
    int code = HIWORD(wParam);
    switch(id){
    case IDC_BUTTON2:
      if(code == BN_CLICKED)
        SendMessage(hWnd, MSG_CLOSE, 0, 0);
    }
    return 0;
  }
  case MSG_DESTROY:
    DestroyAllControls(hWnd);
    printf("The MessageWin has been destroyed!\n");
    return 0;
  case MSG_CLOSE:
    DestroyMainWindow(hWnd);
    MainWindowCleanup(hWnd);
    printf("The MessageWin has been closed!\n");
    return 0;
  }

  return DefaultMainWinProc(hWnd, message, wParam, lParam);
}

static int MessageSendProc(HWND hWnd, int id, int nc, DWORD add_data)
{
  switch(nc){
  case BN_CLICKED:{
      char buffer[256];
      char *p;

      p = (char *)malloc(1024);
      GetWindowText(GetDlgItem(GetParent(hWnd), IDC_EDIT2), p, 1024);
      GetWindowText(GetDlgItem(GetParent(hWnd), IDC_EDIT3), buffer, 255);
      strcat(p, buffer);
      SetWindowText(GetDlgItem(GetParent(hWnd), IDC_EDIT2), p);
      free(p);
      return 0;
    }
    return 0;
  }
}
//=======================信息对话框代码结束====================================================================================//


效果图:





(chenzhuoyou)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。

转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201004/9078.html]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: