// USB_CAN.cpp : 定义应用程序的入口点。
//#include  "StdAfx.h"
#include <windowsx.h>
#include "resource.h"
#include  "tchar.h"
#include "stdafx.h"
#include "USB_CAN.h"
#include<commctrl.h>   //Toolbar是属于comctrl32.dll的扩展功能
#include "CH375DLL.H"
#pragma comment (lib,"CH375DLL")
#include<stdio.h>#include<afxwin.h>#define WINDOW_CLASS_NAME "WINCLASS"#define  ID_TOOLBAR   1001 
#define IDM_BUTTONSTART   0
#define IDC_MAIN_TOOL
#define IDC_MAIN_STATUS   200
#define IDC_CUSTOM        201
#define WIN32_LEAN_AND_MEAN#pragma comment(lib,"comctl32.lib")#define MAX_LOADSTRING 100
TBADDBITMAP tbBitmaps;          //工具栏的前向声明位图结构//
// 全局变量:
HINSTANCE hInst; // 当前实例
TCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本
TCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名
typedef struct _MYPOINT
{
double x;
double y;
}HPPOINT;
//自定义全局变量BOOL WINAPI CH375GetDeviceDescr(  // 读取设备描述符
ULONG iIndex,  // 指定CH375设备序号
PVOID oBuffer,  // 指向一个足够大的缓冲区,用于保存描述符
PULONG ioLength );  // 指向长度单元,输入时为准备读取的长度,返回后为实际读取的长度// 此代码模块中包含的函数的前向声明:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK Open232Mach(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
INT_PTR CALLBACK Position(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
INT_PTR CALLBACK Translate(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);HWND hWndStatus=NULL;
HWND hWndTB=NULL;   
HWND  hWndCus=NULL;     
HMENU hmenu;
HINSTANCE instance;
HWND hWnd;
wchar_t WndTitle[30]={};ULONG mIndex;
BOOL  m_open;
BOOL  m_send;
LV_ITEM lvi;
BOOL m_trddown2;
//BOOL CreateThread(DWORD dwCreateFlags = 0, UINT nStackSize = 0,LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL);
//void mCloseWin();
void OnOpenCH375Device();
HANDLE DevHandle;
HMENU m_hMenu = NULL; //用户菜单
HANDLE T2DHandle;    //端点2下传设备打开句柄
HANDLE T2UHandle;    //端点2上传设备打开句柄
char str[3]="";
HANDLE mTrdDown2;ULONG DownCount,UpCount,InterCount;
VOID CALLBACK CH375NOTIFYROUTINE( ULONG iEventStatus );  // 设备事件和当前状态: 0=设备拔出事件, 3=设备插入事件
void EnumCH375Device();int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);  // TODO: 在此放置代码。
MSG msg;
HACCEL hAccelTable;  
  // 初始化全局字符串
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_USB_CAN, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);
// 执行应用程序初始化:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
} hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_USB_CAN)); // 主消息循环:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
} return (int) msg.wParam;
}
//
//  函数: MyRegisterClass()
//
//  目的: 注册窗口类。
//
//  注释:
//
//    仅当希望
//    此代码与添加到 Windows 95 中的“RegisterClassEx”
//    函数之前的 Win32 系统兼容时,才需要此函数及其用法。调用此函数十分重要,
//    这样应用程序就可以获得关联的
//    “格式正确的”小图标。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;  
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_USB_CAN));
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1);
wcex.lpszMenuName = MAKEINTRESOURCE(IDC_USB_CAN);
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); return RegisterClassEx(&wcex);
}
//
//   函数: InitInstance(HINSTANCE, int)
//
//   目的: 保存实例句柄并创建主窗口
//
//   注释:
//
//        在此函数中,我们在全局变量中保存实例句柄并
//        创建和显示主程序窗口。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;   hInst = hInstance; // 将实例句柄存储在全局变量中   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);   if (!hWnd)
   {
      return FALSE;
   }   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);   return TRUE;   //FindWindowEx(hWnd,hWndOpen,NULL,(LPCWSTR)"打开设备");
   

  // return TRUE  unless you set the focus to a control
}
//
//  函数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目的: 处理主窗口的消息。
//
//  WM_COMMAND - 处理应用程序菜单
//  WM_PAINT - 绘制主窗口
//  WM_DESTROY - 发送退出消息并返回
//
//
//************状态栏。工具栏。输出表格的全局变量**********//
  
TCHAR listindex[] = _T("%d");
//TCHAR listcont1[]  =_T("xx%d");
wchar_t  listcont1[30] ={};
TCHAR listcont2[]  =_T("啊%d");
TCHAR listcont3[]  =_T("额%d");
TCHAR listcont4[]  =_T("飞机%d");//全局变量 
TCHAR listcont5[]; CHAR buffer[20];
//************输出框的表头*****************//
void InsertColumn()
{
LV_COLUMN lvc;
    lvc.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_FMT;
lvc.fmt=LVCFMT_CENTER;
    lvc.pszText =L"序号";
    lvc.cx = 100;
    SendMessage(hWndCus,LVM_INSERTCOLUMN,0,(LPARAM)&lvc);    
    lvc.pszText = L"传输方向";
    lvc.cx = 150;
    SendMessage(hWndCus,LVM_INSERTCOLUMN,1,(LPARAM)&lvc); lvc.pszText = L"第几路CAN";   
    SendMessage(hWndCus,LVM_INSERTCOLUMN,2,(LPARAM)&lvc); lvc.pszText = L"时间标识";
    SendMessage(hWndCus,LVM_INSERTCOLUMN,3,(LPARAM)&lvc); lvc.pszText = L"帧ID";
    SendMessage(hWndCus,LVM_INSERTCOLUMN,4,(LPARAM)&lvc); lvc.pszText = L"帧格式";
    SendMessage(hWndCus,LVM_INSERTCOLUMN,5,(LPARAM)&lvc); lvc.pszText = L"帧类型";
    SendMessage(hWndCus,LVM_INSERTCOLUMN,6,(LPARAM)&lvc); lvc.pszText = L"数据长度";
    SendMessage(hWndCus,LVM_INSERTCOLUMN,7,(LPARAM)&lvc); lvc.pszText = L"数据";
    SendMessage(hWndCus,LVM_INSERTCOLUMN,8,(LPARAM)&lvc);
}void InitListView()
{

int i=0;
int j=0;

for(i=15;i>0;i--)
{
LV_ITEM lvi;

    lvi.mask = LVIF_TEXT;
        lvi.iItem = 0;
        lvi.iSubItem = 0;
wsprintf((LPWSTR)buffer,listindex,(i));
        lvi.pszText =(LPWSTR)buffer;
        SendMessage(hWndCus,LVM_INSERTITEM,0,(LPARAM)&lvi);
       
lvi.iSubItem++;
        wsprintf((LPWSTR)buffer,(LPCWSTR)listcont1,(i));
        lvi.pszText =(LPWSTR)buffer;
        SendMessage(hWndCus,LVM_SETITEM,0,(LPARAM)&lvi);

lvi.iSubItem++;
wsprintf((LPWSTR)buffer,listcont2,3);
        lvi.pszText =(LPWSTR)buffer;
        SendMessage(hWndCus,LVM_SETITEM,0,(LPARAM)&lvi); lvi.iSubItem++;
wsprintf((LPWSTR)buffer,listcont3,(i));
        lvi.pszText =(LPWSTR)buffer;
        SendMessage(hWndCus,LVM_SETITEM,0,(LPARAM)&lvi); lvi.iSubItem=lvi.iSubItem+2;
wsprintf((LPWSTR)buffer,listcont4,(i));
        lvi.pszText =(LPWSTR)buffer;
        SendMessage(hWndCus,LVM_SETITEM,0,(LPARAM)&lvi);

}}
int i;LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc; HWND himl;
int stWidth[] = {180,360,-1,-1,800,-1};

//***************************定义按钮结构*******************************//
TBBUTTON   tbButtons[] = 
{
  {0, ID_DO_OPEN , TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L,0},          //打开设备
  {1,ID_32789,TBSTATE_ENABLED,TBSTYLE_BUTTON, 0L,0},             //关闭设备
  {0,0, TBSTATE_ENABLED, TBSTYLE_SEP, 0L, -1},               //逻辑分割
  {2,ID_32791, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L,0},              //参数设置
  {0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0L, -1},              //逻辑分割
  {3,ID_32793, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L,0},              //缓冲帧数
  {0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0L, -1},              //逻辑分割
  {4,ID_POSITION , TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},         //定位
  {5, ID_32795, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},            //保存
  {0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0L, -1},              //逻辑分割
  {6,ID_32796 , TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L,0},             //刷新
  {0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0L, -1},              //逻辑分割
  {7,ID_32797 , TBSTATE_ENABLED, TBSTYLE_CHECKGROUP, 0L, 0},            //暂停
  {8,ID_32798 , TBSTATE_ENABLED|TBSTATE_CHECKED, TBSTYLE_CHECKGROUP, 0L, 0},             //继续
  {9,ID_32799 , TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},             //滚动到最后行
  {10,ID_32803, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},            //显隐传输操作窗口
  {0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0L, -1},               //逻辑分割
  {11,IDM_ABOUT , TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},              //about           
   
};
INITCOMMONCONTROLSEX icex; 
DWORD dwStyle; icex.dwSize = sizeof(INITCOMMONCONTROLSEX); //下面这两个参数决定了是否注册Toolbar icex.dwICC=ICC_COOL_CLASSES|ICC_BAR_CLASSES; InitCommonControlsEx(&icex);//表格前项
    RECT rect;
    
    GetClientRect(hWnd, &rect);              //获得父窗口坐标值
    int cx = rect.right-rect.left;
    int cy = rect.bottom-rect.top;
int cxy=rect.bottom-rect.top-100;

不急。马上跟上
  

解决方案 »

  1.   

    switch (message)
    {
    case WM_COMMAND:
    wmId    = LOWORD(wParam);
    wmEvent = HIWORD(wParam);
    // 分析菜单选择:
    switch (wmId)

    case ID_DO_OPEN: //打开设备

    DialogBox(hInst, MAKEINTRESOURCE(IDD_CAN232OPEN), hWnd, Open232Mach);
    break;
    case ID_POSITION:                                  //定位
    HWND myhwnd;
               myhwnd = CreateDialog(hInst,MAKEINTRESOURCE(IDD_TRANSLATE),hWnd,Translate);
                ShowWindow(myhwnd,SW_SHOW);           

    //DialogBox(hInst, MAKEINTRESOURCE(IDD_POSITION), hWnd, Position);
    break;

    case IDM_ABOUT:                                
    DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
    break;
    case ID_32801:                                      //工具栏操作勾选和隐藏

    break;
        /*case ID_32803:                                       //显隐传输操作窗口
    DialogBox(hInst,MAKEINTRESOURCE(IDD_TRANSLATE),hWnd,Translate);
    break;*/
    case ID_32789:
          if(m_open){ //关闭设备
    //mCloseWin();
      wsprintf(WndTitle,L"浙江虎王:%04x,USB ID:%04x",0,0);
      SendMessage(hWndStatus,SB_SETTEXT,0,(LPARAM)(LPSTR)WndTitle);
      m_open=FALSE;
      MessageBox(NULL,L"设备已关闭",L"提示",MB_OK);
      EnableMenuItem(m_hMenu, ID_32789, MF_GRAYED);
      return 0;}
           break;
    case ID_32793:
             break;
    case IDM_EXIT:
    DestroyWindow(hWnd);
    break;
    case ID_32792:                                     //退出按钮
    DestroyWindow(hWnd);
    break;
    default:
    return DefWindowProc(hWnd, message, wParam, lParam);
    }
    break;

       case WM_CREATE:  
        m_hMenu = GetMenu(hWnd);      //************底部状态栏**********//
       hWndStatus = CreateWindowEx( 
       0L,                              // 无扩展样式
       STATUSCLASSNAME,                 // 状态栏
       L"",                              // 无文本
       WS_CHILD |SBARS_SIZEGRIP | WS_VISIBLE,  // 样式
       0, 0, 0, 0,              // x, y, cx, cy
       hWnd,                            // 父窗口
       (HMENU)IDC_MAIN_STATUS,
       GetModuleHandle(NULL),                           // 实例句柄
       NULL);                           // 窗口数据
       if (hWndStatus == NULL)
       MessageBox (NULL, L"Status Bar not created!", NULL, MB_OK );    SendMessage(hWndStatus,SB_SETPARTS,6,(LPARAM)(stWidth));
       SendMessage(hWndStatus,SB_SETTEXT,1,(LPARAM)TEXT("无设备"));
        SendMessage(hWndStatus,SB_SETTEXT,0,(LPARAM)TEXT("浙江虎王:0000 USB ID:0000"));

         for(i=0;i<mCH375_MAX_NUMBER;i++){
       if(CH375OpenDevice(i)!=INVALID_HANDLE_VALUE){//初始化时检测是否有已插入的CH372/CH375设备
    //char tem[50]="";
    //::sprintf(tem,"浙江虎王USB_CAN设备已插入...");
        SendMessage(hWndStatus,SB_SETTEXT,1,(LPARAM)TEXT("虎王USB_CAN设备已插入."));

    CH375CloseDevice(i);
    }
       }

    CH375SetDeviceNotify(0,NULL,CH375NOTIFYROUTINE);//启动指定序号设备插拔监视
    DevHandle = INVALID_HANDLE_VALUE; 
    DownCount=0;
    UpCount=0;
    InterCount=0;
    UpdateWindow(hWnd);
       //CheckMenultem       ///////////////////创建工具栏////////////////////    hWndTB   =   CreateToolbarEx(hWnd, 
       WS_CHILD   |   WS_VISIBLE       
       |   TBSTYLE_TOOLTIPS |CCS_NODIVIDER|TBSTYLE_FLAT|TBSTYLE_TRANSPARENT , 
       ID_TOOLBAR, 
       18, 
       hInst, 
       IDB_BITMAP1, 
       (LPCTBBUTTON) &tbButtons, 
       18,
       64, 
       64, 
       64, 
       64, 
       sizeof(TBBUTTON));     //创建工具栏按钮。    himl =(HWND) ImageList_Create(64,64,ILC_COLOR8,12,0); //创建工具栏按钮。
       //加入事先作好的工具条位图引入按钮     ImageList_Add((HIMAGELIST) himl, LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BITMAP3)),NULL); 
       ImageList_Add((HIMAGELIST) himl, LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BITMAP5)),NULL); 
       ImageList_Add((HIMAGELIST) himl, LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BITMAP9)),NULL); 
       ImageList_Add((HIMAGELIST) himl, LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BITMAP7)),NULL); 
       ImageList_Add((HIMAGELIST) himl, LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BITMAP4)),NULL);
       ImageList_Add((HIMAGELIST) himl, LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BITMAP2)),NULL);
       ImageList_Add((HIMAGELIST) himl, LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BITMAP10)),NULL);
       ImageList_Add((HIMAGELIST) himl, LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BITMAP1)),NULL);
       ImageList_Add((HIMAGELIST) himl, LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BITMAP8)),NULL);
       ImageList_Add((HIMAGELIST) himl, LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BITMAP6)),NULL);
       ImageList_Add((HIMAGELIST) himl, LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BITMAP11)),NULL);
       ImageList_Add((HIMAGELIST) himl, LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BITMAP12)),NULL);
       //通过消息把位图加入到Toolbar中     SendMessage(hWndTB, TB_SETIMAGELIST, 0, (LPARAM)himl);     for(int i=0;i<18;i++){     tbButtons[i].iBitmap = i; //第i个位图     tbButtons[i].idCommand = IDM_BUTTONSTART+i;     //命令ID     tbButtons[i].fsState = TBSTATE_ENABLED;     tbButtons[i].fsStyle = TBSTYLE_BUTTON;     //按钮风格     tbButtons[i].dwData = 0;     tbButtons[i].iString = i; //显示的字符串     } 
     ::SendMessage(hWndTB,TB_ADDBUTTONS,(UINT)0, (LPARAM)tbButtons);     //ShowWindow(hWndTB, SW_SHOWMAXIMIZED);
       //工具栏下的黑线.....................................................
       CreateWindow(
       TEXT("static"),  //lpClassName 类名
       NULL,  //lpWindowName 标题
       WS_CHILD|WS_VISIBLE|SS_BLACKFRAME,
       1,70,1500,3,
       hWnd,  //hWndParent
       NULL,  //hMenu
       hInst,
       NULL);  //lpParam  额外的参数    //创建客户区窗口
       hWndCus = CreateWindowEx
       (LVS_EX_FULLROWSELECT,
       _T("SysListView32"),
       NULL,
       LVS_REPORT | 
       WS_CHILD |WS_VISIBLE|WS_VSCROLL,
       0,0,0,0,hWnd,(HMENU)IDC_CUSTOM,hInst,NULL);
       InsertColumn();
       InitListView();    SetFocus(hWndCus);    //ListView_SetItemState(hWndCus,0,LVIS_SELECTED,LVIS_SELECTED);                
       //参数0使第一行处于选择中状态,若为-1则表示所有的行    ListView_SetExtendedListViewStyle(hWndCus,LVS_EX_FULLROWSELECT);              //设置整行选择风格   break;
    case  WM_SIZE:

                {   
                    GetClientRect(hWnd, &rect);
                    MoveWindow(hWndStatus,rect.left, rect.bottom-30, rect.right - rect.left, 100, TRUE);
                    MoveWindow(hWndTB,rect.left, rect.top, rect.right - rect.left, 64, TRUE);
    MoveWindow(hWndCus,rect.left,rect.top+80,rect.right-rect.left,cxy,TRUE);
    //UpdateWindow(hWndCus);

    //UpdateWindow(hWndTB);
    //UpdateWindow(hWndStatus);
                   
                }
    break; case WM_PAINT:
    hdc = BeginPaint(hWnd, &ps);
    // TODO: 在此添加任意绘图代码...
    EndPaint(hWnd, &ps);
       break;
    case WM_DESTROY:
    PostQuitMessage(0);
    break;
    default:
    return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
    }
      

  2.   

    这代码怎么用啊,压缩一下传csdn下载频道吧,如果有设备相关的程序,别人也没法调啊。
      

  3.   


    // “关于”框的消息处理程序。
    INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
    {
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
    return (INT_PTR)TRUE; case WM_COMMAND:
    if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
    {
    EndDialog(hDlg, LOWORD(wParam));
    return (INT_PTR)TRUE;
    }
    break;
    }
    return (INT_PTR)FALSE;
    }INT_PTR CALLBACK Open232Mach(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)  // 打开设备的窗口消息
    {
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_CREATE:


    break; case WM_INITDIALOG:


    for(int m=0;m<mCH375_MAX_NUMBER;m++)
    {//填充设备序号(0-15)
     itoa(m,str,10);
    ::SendDlgItemMessage(hDlg,IDC_COMBO2,CB_ADDSTRING,0, (LPARAM)str);
    }
    ::SendDlgItemMessage(hDlg,IDC_COMBO2,CB_SETCURSEL,0,0);
    UpdateWindow(hDlg);
    return (INT_PTR)TRUE; break;
    case WM_COMMAND:
    if(LOWORD(wParam)== IDOK)
      {
      wchar_t  WndTitle[30]={};
           ULONG DeviceID=0;
             if(m_open){ //设备已被打开,先关闭
          //mCloseWin();
     MessageBox(NULL,L"设备已经打开,请先关闭设备",NULL,MB_OK|MB_ICONSTOP);
      EndDialog(hDlg, LOWORD(wParam));
      m_open=TRUE;
     


           }
     else{
    mIndex = ::SendDlgItemMessage(hDlg,IDC_COMBO2,CB_GETCURSEL,0,0);
    // 使用之前必须打开设备
    DevHandle = CH375OpenDevice( mIndex ) ;
    if (DevHandle == INVALID_HANDLE_VALUE ){  
    m_open = FALSE;
    //sprintf(WndTitle,"打开%d#设备失败!",mIndex);
    MessageBox(NULL,L"请确认设备已连接",NULL,MB_OK|MB_ICONSTOP);
    return 0;
           }
    m_open = TRUE;
    DeviceID = CH375GetUsbID(mIndex); //获取当前打开的USB设备ID,返回数据中,低16位为厂商ID,高16位为产品ID,错误时返回全0(无效ID)
    wsprintf(WndTitle,L"浙江虎王:%04x,USB ID:%04x",LOWORD(DeviceID),HIWORD(DeviceID));
     SendMessage(hWndStatus,SB_SETTEXT,0,(LPARAM)(LPSTR)WndTitle);
    //让关闭设备有效

     EnableMenuItem(m_hMenu, ID_32789, MF_ENABLED);  //禁用菜单关闭设备

     SendMessage( hWndTB, TB_SETSTATE, (WPARAM)ID_32789, (LPARAM)MAKELONG(TBSTATE_ENABLED , 0));
             EndDialog(hDlg, LOWORD(wParam));

    }
    } if (LOWORD(wParam) == IDCANCEL)
    {
    EndDialog(hDlg, LOWORD(wParam));
    return (INT_PTR)TRUE;
    }
    break;
    }

    return (INT_PTR)FALSE;
    }
    INT_PTR CALLBACK Position(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)  //定位的窗口消息
    {
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
    return (INT_PTR)TRUE; case WM_COMMAND:
    if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
    {
    EndDialog(hDlg, LOWORD(wParam));
    return (INT_PTR)TRUE;
    }
    break;
    } return (INT_PTR)FALSE;
    }
     //传输操作窗口

    INT_PTR CALLBACK Translate(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)


    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
    return (INT_PTR)TRUE; case WM_COMMAND:
    wchar_t szText[80]={};
    if (LOWORD(wParam) == IDOK)
         //端点2下传线程
    //判断设备是否打开
    {
    if(m_open==FALSE)    //设备未打开
      {MessageBox(hWnd,L"请先确认设备已经打开",L"提示",MB_OK);
      }
    //设备已经打开
    if(m_open==TRUE)
      {
    CHAR buffer1[20];
    wchar_t  listcont6[30] ={};
    GetDlgItemText(hDlg,IDC_EDIT5,listcont6,mCH375_PACKET_LENGTH);


    lvi.mask = LVIF_TEXT;
            lvi.iItem = 0;
            lvi.iSubItem = 7;
        wsprintf((LPWSTR)buffer1,listcont6,(i));
    lvi.pszText =(LPWSTR)buffer1;
        SendMessage(hWndCus,LVM_INSERTITEM,0,(LPARAM)&lvi);
    //将输入的数据发送到listview
    if(T2DHandle == INVALID_HANDLE_VALUE){
            UCHAR DeviceName[128];
    memcpy(&DeviceName[0],CH375GetDeviceName(mIndex),sizeof(DeviceName));

    T2DHandle = CreateFile( (LPCWSTR)&DeviceName[0], GENERIC_READ | GENERIC_WRITE,  // 打开设备
    FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
    if(T2DHandle == INVALID_HANDLE_VALUE)
    {
    MessageBox(hDlg,L"无法打开设备!",L"警告!",MB_OK|MB_ICONSTOP);
    return 0;
    } }

    if(sizeof(buffer1) > mCH375_PACKET_LENGTH*64 )
    {
    MessageBox(hWnd,L"批量下传数据长度一次最大为4096!",L"DEBUG375",MB_OK);
    return 0;
    }

    //线程句柄有效,说明上次线程已退出

    if(mTrdDown2 != INVALID_HANDLE_VALUE)
    {
    CloseHandle(mTrdDown2); //释放线程句柄
    mTrdDown2 = NULL;
    }
    }
    }
    if ( LOWORD(wParam) == IDCANCEL)
    {
    EndDialog(hDlg, LOWORD(wParam));
    return (INT_PTR)TRUE;
    }
    break;
    }
    return (INT_PTR)FALSE;
    }/* 设备事件通知回调程序,在此程序里不宜作过多的操作,主要是因为中断服务程序优先级高,
    不宜进行USB传输,通常只是发个消息或者置个全局变量通知主程序处理。*/
    VOID CALLBACK CH375NOTIFYROUTINE( 
             ULONG iEventStatus ){ //设备事件和当前状态: 0=设备拔出事件, 3=设备插入事件

    if(iEventStatus==CH375_DEVICE_ARRIVAL){ //检测到设备插入事件   SendMessage(hWndStatus,SB_SETTEXT,1,(LPARAM)TEXT("虎王USB_CAN设备已插入.")); //等效于单击打开设备按钮
    }
    else if(iEventStatus==CH375_DEVICE_REMOVE){ //检测到设备拔出事件

      SendMessage(hWndStatus,SB_SETTEXT,1,(LPARAM)TEXT("虎王USB_CAN设备已拔出."));//等效于单击打开设备按钮
    if(DevHandle != INVALID_HANDLE_VALUE)
    ::SendDlgItemMessage(hWnd,ID_DO_OPEN,BM_CLICK,0,0); //等效于单击打开设备按钮 //等效于单击打开设备按钮
    }
    return;
    }代码已经发完。这个是我写的代码。
    目前到最后一步就是在非模态对话窗口传输操作窗口中的发送按钮将一个edit控件的数据发送给usb设备。我这有个mfc写的样板。下午再把样板发下。然后把软件截图出来给大家看下。现在去吃饭。马上回来。
    最后的发送建立线程的完全不懂。。未完待续。。10min马上回来
      

  4.   

    USB_CAN.cpp : 定义应用程序的入口点。
    //#include "StdAfx.h"
    #include <windowsx.h>
    #include "resource.h"
    #include "tchar.h"
    #include "stdafx.h"
    #include "USB_CAN.h"
    #include<commctrl.h> //Toolbar是属于comctrl32.dll的扩展功能
    #include "CH375DLL.H"
    #pragma comment (lib,"CH375DLL")
    #include<stdio.h>#include<afxwin.h>#define WINDOW_CLASS_NAME "WINCLASS"#define ID_TOOLBAR 1001  
    #define IDM_BUTTONSTART 0
    #define IDC_MAIN_TOOL
    #define IDC_MAIN_STATUS 200
    #define IDC_CUSTOM 201
    #define WIN32_LEAN_AND_MEAN#pragma comment(lib,"comctl32.lib")#define MAX_LOADSTRING 100
    TBADDBITMAP tbBitmaps; //工具栏的前向声明位图结构//
    // 全局变量:
    HINSTANCE hInst; // 当前实例
    TCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本
    TCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名
    typedef struct _MYPOINT
    {
    double x;
    double y;
    }HPPOINT;
    //自定义全局变量BOOL WINAPI CH375GetDeviceDescr( // 读取设备描述符
    ULONG iIndex, // 指定CH375设备序号
    PVOID oBuffer, // 指向一个足够大的缓冲区,用于保存描述符
    PULONG ioLength ); // 指向长度单元,输入时为准备读取的长度,返回后为实际读取的长度// 此代码模块中包含的函数的前向声明:
    ATOM MyRegisterClass(HINSTANCE hInstance);
    BOOL InitInstance(HINSTANCE, int);
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
    INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
    INT_PTR CALLBACK Open232Mach(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
    INT_PTR CALLBACK Position(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
    INT_PTR CALLBACK Translate(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);HWND hWndStatus=NULL; 
    HWND hWndTB=NULL;   
    HWND hWndCus=NULL;   
    HMENU hmenu;
    HINSTANCE instance;
    HWND hWnd;
    wchar_t WndTitle[30]={};ULONG mIndex;
    BOOL m_open;
    BOOL m_send;
    LV_ITEM lvi;
    BOOL m_trddown2;
    //BOOL CreateThread(DWORD dwCreateFlags = 0, UINT nStackSize = 0,LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL);
    //void mCloseWin();
    void OnOpenCH375Device();
    HANDLE DevHandle;
    HMENU m_hMenu = NULL; //用户菜单
    HANDLE T2DHandle; //端点2下传设备打开句柄
    HANDLE T2UHandle; //端点2上传设备打开句柄
    char str[3]="";
    HANDLE mTrdDown2;ULONG DownCount,UpCount,InterCount;
    VOID CALLBACK CH375NOTIFYROUTINE( ULONG iEventStatus ); // 设备事件和当前状态: 0=设备拔出事件, 3=设备插入事件
    void EnumCH375Device();int APIENTRY _tWinMain(HINSTANCE hInstance,
      HINSTANCE hPrevInstance,
      LPTSTR lpCmdLine,
      int nCmdShow)
    {
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);  // TODO: 在此放置代码。
    MSG msg;
    HACCEL hAccelTable; 
      // 初始化全局字符串
    LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadString(hInstance, IDC_USB_CAN, szWindowClass, MAX_LOADSTRING);
    MyRegisterClass(hInstance);
    // 执行应用程序初始化:
    if (!InitInstance (hInstance, nCmdShow))
    {
    return FALSE;
    }hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_USB_CAN));// 主消息循环:
    while (GetMessage(&msg, NULL, 0, 0))
    {
    if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    }return (int) msg.wParam;
    }
    //
    // 函数: MyRegisterClass()
    //
    // 目的: 注册窗口类。
    //
    // 注释:
    //
    // 仅当希望
    // 此代码与添加到 Windows 95 中的“RegisterClassEx”
    // 函数之前的 Win32 系统兼容时,才需要此函数及其用法。调用此函数十分重要,
    // 这样应用程序就可以获得关联的
    // “格式正确的”小图标。
    //
    ATOM MyRegisterClass(HINSTANCE hInstance)
    {
    WNDCLASSEX wcex;wcex.cbSize = sizeof(WNDCLASSEX);wcex.style = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc = WndProc;
    wcex.cbClsExtra = 0;
    wcex.cbWndExtra = 0;   
    wcex.hInstance = hInstance;
    wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_USB_CAN));
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1);
    wcex.lpszMenuName = MAKEINTRESOURCE(IDC_USB_CAN);
    wcex.lpszClassName = szWindowClass;
    wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));return RegisterClassEx(&wcex);
    }
    //
    // 函数: InitInstance(HINSTANCE, int)
    //
    // 目的: 保存实例句柄并创建主窗口
    //
    // 注释:
    //
    // 在此函数中,我们在全局变量中保存实例句柄并
    // 创建和显示主程序窗口。
    //
    BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
    {
      HWND hWnd;  hInst = hInstance; // 将实例句柄存储在全局变量中  hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);  if (!hWnd)
      {
      return FALSE;
      }  ShowWindow(hWnd, nCmdShow);
      UpdateWindow(hWnd);  return TRUE;  //FindWindowEx(hWnd,hWndOpen,NULL,(LPCWSTR)"打开设备");
        // return TRUE unless you set the focus to a control
    }
    //
    // 函数: WndProc(HWND, UINT, WPARAM, LPARAM)
    //
    // 目的: 处理主窗口的消息。
    //
    // WM_COMMAND - 处理应用程序菜单
    // WM_PAINT - 绘制主窗口
    // WM_DESTROY - 发送退出消息并返回
    //
    //
    //************状态栏。工具栏。输出表格的全局变量**********//
       
    TCHAR listindex[] = _T("%d");
    //TCHAR listcont1[] =_T("xx%d");
    wchar_t listcont1[30] ={};
    TCHAR listcont2[] =_T("啊%d");
    TCHAR listcont3[] =_T("额%d");
    TCHAR listcont4[] =_T("飞机%d");//全局变量  
    TCHAR listcont5[];CHAR buffer[20];
    //************输出框的表头*****************//
    void InsertColumn()
    {
    LV_COLUMN lvc;
      lvc.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_FMT;
    lvc.fmt=LVCFMT_CENTER;
      lvc.pszText =L"序号";
      lvc.cx = 100;
      SendMessage(hWndCus,LVM_INSERTCOLUMN,0,(LPARAM)&lvc);    
      lvc.pszText = L"传输方向";
      lvc.cx = 150;
      SendMessage(hWndCus,LVM_INSERTCOLUMN,1,(LPARAM)&lvc);lvc.pszText = L"第几路CAN";   
      SendMessage(hWndCus,LVM_INSERTCOLUMN,2,(LPARAM)&lvc);lvc.pszText = L"时间标识";
      SendMessage(hWndCus,LVM_INSERTCOLUMN,3,(LPARAM)&lvc);lvc.pszText = L"帧ID";
      SendMessage(hWndCus,LVM_INSERTCOLUMN,4,(LPARAM)&lvc);lvc.pszText = L"帧格式";
      SendMessage(hWndCus,LVM_INSERTCOLUMN,5,(LPARAM)&lvc);lvc.pszText = L"帧类型";
      SendMessage(hWndCus,LVM_INSERTCOLUMN,6,(LPARAM)&lvc);lvc.pszText = L"数据长度";
      SendMessage(hWndCus,LVM_INSERTCOLUMN,7,(LPARAM)&lvc);lvc.pszText = L"数据";
      SendMessage(hWndCus,LVM_INSERTCOLUMN,8,(LPARAM)&lvc);
    }void InitListView()
    {int i=0;
    int j=0;for(i=15;i>0;i--)

    LV_ITEM lvi;lvi.mask = LVIF_TEXT;
      lvi.iItem = 0;
      lvi.iSubItem = 0;
    wsprintf((LPWSTR)buffer,listindex,(i));
      lvi.pszText =(LPWSTR)buffer;
      SendMessage(hWndCus,LVM_INSERTITEM,0,(LPARAM)&lvi);
        
    lvi.iSubItem++;
      wsprintf((LPWSTR)buffer,(LPCWSTR)listcont1,(i));
      lvi.pszText =(LPWSTR)buffer;
      SendMessage(hWndCus,LVM_SETITEM,0,(LPARAM)&lvi);lvi.iSubItem++;
    wsprintf((LPWSTR)buffer,listcont2,3);
      lvi.pszText =(LPWSTR)buffer;
      SendMessage(hWndCus,LVM_SETITEM,0,(LPARAM)&lvi);lvi.iSubItem++;
    wsprintf((LPWSTR)buffer,listcont3,(i));
      lvi.pszText =(LPWSTR)buffer;
      SendMessage(hWndCus,LVM_SETITEM,0,(LPARAM)&lvi);lvi.iSubItem=lvi.iSubItem+2;
    wsprintf((LPWSTR)buffer,listcont4,(i));
      lvi.pszText =(LPWSTR)buffer;
      SendMessage(hWndCus,LVM_SETITEM,0,(LPARAM)&lvi);}}
    int i;LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;HWND himl;
    int stWidth[] = {180,360,-1,-1,800,-1};//***************************定义按钮结构*******************************//
    TBBUTTON tbButtons[] =  
    {
      {0, ID_DO_OPEN , TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L,0}, //打开设备
      {1,ID_32789,TBSTATE_ENABLED,TBSTYLE_BUTTON, 0L,0}, //关闭设备
      {0,0, TBSTATE_ENABLED, TBSTYLE_SEP, 0L, -1}, //逻辑分割
      {2,ID_32791, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L,0}, //参数设置
      {0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0L, -1}, //逻辑分割
      {3,ID_32793, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L,0}, //缓冲帧数
      {0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0L, -1}, //逻辑分割
      {4,ID_POSITION , TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0}, //定位
      {5, ID_32795, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0}, //保存
      {0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0L, -1}, //逻辑分割
      {6,ID_32796 , TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L,0}, //刷新
      {0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0L, -1}, //逻辑分割
      {7,ID_32797 , TBSTATE_ENABLED, TBSTYLE_CHECKGROUP, 0L, 0}, //暂停
      {8,ID_32798 , TBSTATE_ENABLED|TBSTATE_CHECKED, TBSTYLE_CHECKGROUP, 0L, 0}, //继续
      {9,ID_32799 , TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0}, //滚动到最后行
      {10,ID_32803, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0}, //显隐传输操作窗口
      {0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0L, -1}, //逻辑分割
      {11,IDM_ABOUT , TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0}, //about   
        
    };
    INITCOMMONCONTROLSEX icex;  
    DWORD dwStyle;  icex.dwSize = sizeof(INITCOMMONCONTROLSEX);  //下面这两个参数决定了是否注册Toolbar  icex.dwICC=ICC_COOL_CLASSES|ICC_BAR_CLASSES;  InitCommonControlsEx(&icex);//表格前项
      RECT rect;
        
      GetClientRect(hWnd, &rect); //获得父窗口坐标值
      int cx = rect.right-rect.left;
      int cy = rect.bottom-rect.top;
    int cxy=rect.bottom-rect.top-100;
    不好意思。。没弄过。
      

  5.   


    switch (message)
    {
    case WM_COMMAND:
    wmId = LOWORD(wParam);
    wmEvent = HIWORD(wParam);
    // 分析菜单选择:
    switch (wmId)
    {  
    case ID_DO_OPEN: //打开设备DialogBox(hInst, MAKEINTRESOURCE(IDD_CAN232OPEN), hWnd, Open232Mach);
    break;
    case ID_POSITION: //定位
    HWND myhwnd;
      myhwnd = CreateDialog(hInst,MAKEINTRESOURCE(IDD_TRANSLATE),hWnd,Translate);
      ShowWindow(myhwnd,SW_SHOW);  //DialogBox(hInst, MAKEINTRESOURCE(IDD_POSITION), hWnd, Position);
    break;case IDM_ABOUT:   
    DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
    break;
    case ID_32801: //工具栏操作勾选和隐藏break;
    /*case ID_32803: //显隐传输操作窗口
    DialogBox(hInst,MAKEINTRESOURCE(IDD_TRANSLATE),hWnd,Translate);
    break;*/
    case ID_32789:
    if(m_open){ //关闭设备
    //mCloseWin();
    wsprintf(WndTitle,L"浙江虎王:%04x,USB ID:%04x",0,0);
    SendMessage(hWndStatus,SB_SETTEXT,0,(LPARAM)(LPSTR)WndTitle);
    m_open=FALSE;
    MessageBox(NULL,L"设备已关闭",L"提示",MB_OK);
    EnableMenuItem(m_hMenu, ID_32789, MF_GRAYED);
    return 0;}
    break;
    case ID_32793:
      break;
    case IDM_EXIT:
    DestroyWindow(hWnd);
    break;
    case ID_32792: //退出按钮
    DestroyWindow(hWnd);
    break;
    default:
    return DefWindowProc(hWnd, message, wParam, lParam);
    }
    break;  case WM_CREATE:   
    m_hMenu = GetMenu(hWnd);//************底部状态栏**********//
    hWndStatus = CreateWindowEx(  
    0L, // 无扩展样式
    STATUSCLASSNAME, // 状态栏
    L"", // 无文本
    WS_CHILD |SBARS_SIZEGRIP | WS_VISIBLE, // 样式
    0, 0, 0, 0, // x, y, cx, cy
    hWnd, // 父窗口
    (HMENU)IDC_MAIN_STATUS,
    GetModuleHandle(NULL), // 实例句柄
    NULL); // 窗口数据
    if (hWndStatus == NULL)
    MessageBox (NULL, L"Status Bar not created!", NULL, MB_OK );SendMessage(hWndStatus,SB_SETPARTS,6,(LPARAM)(stWidth));
    SendMessage(hWndStatus,SB_SETTEXT,1,(LPARAM)TEXT("无设备"));
    SendMessage(hWndStatus,SB_SETTEXT,0,(LPARAM)TEXT("浙江虎王:0000 USB ID:0000"));for(i=0;i<mCH375_MAX_NUMBER;i++){
    if(CH375OpenDevice(i)!=INVALID_HANDLE_VALUE){//初始化时检测是否有已插入的CH372/CH375设备
    //char tem[50]="";
    //::sprintf(tem,"浙江虎王USB_CAN设备已插入...");
    SendMessage(hWndStatus,SB_SETTEXT,1,(LPARAM)TEXT("虎王USB_CAN设备已插入."));CH375CloseDevice(i);
    }
    }CH375SetDeviceNotify(0,NULL,CH375NOTIFYROUTINE);//启动指定序号设备插拔监视
    DevHandle = INVALID_HANDLE_VALUE;  
    DownCount=0;
    UpCount=0;
    InterCount=0;
    UpdateWindow(hWnd);
    //CheckMenultem   ///////////////////创建工具栏////////////////////hWndTB = CreateToolbarEx(hWnd,  
    WS_CHILD | WS_VISIBLE   
    | TBSTYLE_TOOLTIPS |CCS_NODIVIDER|TBSTYLE_FLAT|TBSTYLE_TRANSPARENT ,  
    ID_TOOLBAR,  
    18,  
    hInst,  
    IDB_BITMAP1,  
    (LPCTBBUTTON) &tbButtons,  
    18,
    64,  
    64,  
    64,  
    64,  
    sizeof(TBBUTTON));  //创建工具栏按钮。himl =(HWND) ImageList_Create(64,64,ILC_COLOR8,12,0); //创建工具栏按钮。
    //加入事先作好的工具条位图引入按钮  ImageList_Add((HIMAGELIST) himl, LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BITMAP3)),NULL);  
    ImageList_Add((HIMAGELIST) himl, LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BITMAP5)),NULL);  
    ImageList_Add((HIMAGELIST) himl, LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BITMAP9)),NULL);  
    ImageList_Add((HIMAGELIST) himl, LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BITMAP7)),NULL);  
    ImageList_Add((HIMAGELIST) himl, LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BITMAP4)),NULL);
    ImageList_Add((HIMAGELIST) himl, LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BITMAP2)),NULL);
    ImageList_Add((HIMAGELIST) himl, LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BITMAP10)),NULL);
    ImageList_Add((HIMAGELIST) himl, LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BITMAP1)),NULL);
    ImageList_Add((HIMAGELIST) himl, LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BITMAP8)),NULL);
    ImageList_Add((HIMAGELIST) himl, LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BITMAP6)),NULL);
    ImageList_Add((HIMAGELIST) himl, LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BITMAP11)),NULL);
    ImageList_Add((HIMAGELIST) himl, LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BITMAP12)),NULL);
    //通过消息把位图加入到Toolbar中  SendMessage(hWndTB, TB_SETIMAGELIST, 0, (LPARAM)himl);  for(int i=0;i<18;i++){  tbButtons[i].iBitmap = i; //第i个位图  tbButtons[i].idCommand = IDM_BUTTONSTART+i;  //命令ID  tbButtons[i].fsState = TBSTATE_ENABLED;  tbButtons[i].fsStyle = TBSTYLE_BUTTON;  //按钮风格  tbButtons[i].dwData = 0;  tbButtons[i].iString = i; //显示的字符串  }  
     ::SendMessage(hWndTB,TB_ADDBUTTONS,(UINT)0, (LPARAM)tbButtons);  //ShowWindow(hWndTB, SW_SHOWMAXIMIZED);
    //工具栏下的黑线.....................................................
    CreateWindow(
    TEXT("static"), //lpClassName 类名
    NULL, //lpWindowName 标题
    WS_CHILD|WS_VISIBLE|SS_BLACKFRAME,
    1,70,1500,3,
    hWnd, //hWndParent
    NULL, //hMenu
    hInst,
    NULL); //lpParam 额外的参数//创建客户区窗口
    hWndCus = CreateWindowEx
    (LVS_EX_FULLROWSELECT,
    _T("SysListView32"),
    NULL,
    LVS_REPORT |  
    WS_CHILD |WS_VISIBLE|WS_VSCROLL,
    0,0,0,0,hWnd,(HMENU)IDC_CUSTOM,hInst,NULL);
    InsertColumn();
    InitListView();SetFocus(hWndCus);//ListView_SetItemState(hWndCus,0,LVIS_SELECTED,LVIS_SELECTED);   
    //参数0使第一行处于选择中状态,若为-1则表示所有的行ListView_SetExtendedListViewStyle(hWndCus,LVS_EX_FULLROWSELECT); //设置整行选择风格break;
    case WM_SIZE:  {   
      GetClientRect(hWnd, &rect);
      MoveWindow(hWndStatus,rect.left, rect.bottom-30, rect.right - rect.left, 100, TRUE);
      MoveWindow(hWndTB,rect.left, rect.top, rect.right - rect.left, 64, TRUE);
    MoveWindow(hWndCus,rect.left,rect.top+80,rect.right-rect.left,cxy,TRUE);
    //UpdateWindow(hWndCus);//UpdateWindow(hWndTB);
    //UpdateWindow(hWndStatus);
        
      }
    break;case WM_PAINT:
    hdc = BeginPaint(hWnd, &ps);
    // TODO: 在此添加任意绘图代码...
    EndPaint(hWnd, &ps);
    break;
    case WM_DESTROY:
    PostQuitMessage(0);
    break;
    default:
    return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
    }
      

  6.   


    // “关于”框的消息处理程序。
    INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
    {
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
    return (INT_PTR)TRUE;case WM_COMMAND:
    if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
    {
    EndDialog(hDlg, LOWORD(wParam));
    return (INT_PTR)TRUE;
    }
    break;
    }
    return (INT_PTR)FALSE;
    }INT_PTR CALLBACK Open232Mach(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) // 打开设备的窗口消息
    {
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_CREATE:
    break;case WM_INITDIALOG:
    for(int m=0;m<mCH375_MAX_NUMBER;m++)
    {//填充设备序号(0-15) 
    itoa(m,str,10);
    ::SendDlgItemMessage(hDlg,IDC_COMBO2,CB_ADDSTRING,0, (LPARAM)str);
    }
    ::SendDlgItemMessage(hDlg,IDC_COMBO2,CB_SETCURSEL,0,0);
    UpdateWindow(hDlg);
    return (INT_PTR)TRUE;break;
    case WM_COMMAND:
    if(LOWORD(wParam)== IDOK)
    {
    wchar_t WndTitle[30]={};
    ULONG DeviceID=0;
    if(m_open){ //设备已被打开,先关闭 
    //mCloseWin();
    MessageBox(NULL,L"设备已经打开,请先关闭设备",NULL,MB_OK|MB_ICONSTOP);
    EndDialog(hDlg, LOWORD(wParam));
    m_open=TRUE;
      
    }
    else{
    mIndex = ::SendDlgItemMessage(hDlg,IDC_COMBO2,CB_GETCURSEL,0,0);
    // 使用之前必须打开设备
    DevHandle = CH375OpenDevice( mIndex ) ;
    if (DevHandle == INVALID_HANDLE_VALUE ){ 
    m_open = FALSE;
    //sprintf(WndTitle,"打开%d#设备失败!",mIndex);
    MessageBox(NULL,L"请确认设备已连接",NULL,MB_OK|MB_ICONSTOP); 
    return 0;
    }
    m_open = TRUE;
    DeviceID = CH375GetUsbID(mIndex); //获取当前打开的USB设备ID,返回数据中,低16位为厂商ID,高16位为产品ID,错误时返回全0(无效ID)
    wsprintf(WndTitle,L"浙江虎王:%04x,USB ID:%04x",LOWORD(DeviceID),HIWORD(DeviceID));
    SendMessage(hWndStatus,SB_SETTEXT,0,(LPARAM)(LPSTR)WndTitle);
    //让关闭设备有效EnableMenuItem(m_hMenu, ID_32789, MF_ENABLED); //禁用菜单关闭设备SendMessage( hWndTB, TB_SETSTATE, (WPARAM)ID_32789, (LPARAM)MAKELONG(TBSTATE_ENABLED , 0));
      EndDialog(hDlg, LOWORD(wParam));}
    }if (LOWORD(wParam) == IDCANCEL)
    {
    EndDialog(hDlg, LOWORD(wParam));
    return (INT_PTR)TRUE;
    }
    break;
    }return (INT_PTR)FALSE;
    }
    INT_PTR CALLBACK Position(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) //定位的窗口消息
    {
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
    return (INT_PTR)TRUE;case WM_COMMAND:
    if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
    {
    EndDialog(hDlg, LOWORD(wParam));
    return (INT_PTR)TRUE;
    }
    break;
    }return (INT_PTR)FALSE;
    }
     //传输操作窗口INT_PTR CALLBACK Translate(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
    { UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
    return (INT_PTR)TRUE;case WM_COMMAND:
    wchar_t szText[80]={};
    if (LOWORD(wParam) == IDOK)
      //端点2下传线程
    //判断设备是否打开
    {
    if(m_open==FALSE) //设备未打开
    {MessageBox(hWnd,L"请先确认设备已经打开",L"提示",MB_OK);
    }
    //设备已经打开
    if(m_open==TRUE)
      {
    CHAR buffer1[20];
    wchar_t listcont6[30] ={};
    GetDlgItemText(hDlg,IDC_EDIT5,listcont6,mCH375_PACKET_LENGTH);
    lvi.mask = LVIF_TEXT;
      lvi.iItem = 0;
      lvi.iSubItem = 7;
    wsprintf((LPWSTR)buffer1,listcont6,(i));
    lvi.pszText =(LPWSTR)buffer1;
    SendMessage(hWndCus,LVM_INSERTITEM,0,(LPARAM)&lvi);
    //将输入的数据发送到listview
    if(T2DHandle == INVALID_HANDLE_VALUE){
      UCHAR DeviceName[128];
    memcpy(&DeviceName[0],CH375GetDeviceName(mIndex),sizeof(DeviceName));T2DHandle = CreateFile( (LPCWSTR)&DeviceName[0], GENERIC_READ | GENERIC_WRITE, // 打开设备
    FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
    if(T2DHandle == INVALID_HANDLE_VALUE)
    {
    MessageBox(hDlg,L"无法打开设备!",L"警告!",MB_OK|MB_ICONSTOP);
    return 0;
    }}if(sizeof(buffer1) > mCH375_PACKET_LENGTH*64 )
    {
    MessageBox(hWnd,L"批量下传数据长度一次最大为4096!",L"DEBUG375",MB_OK);
    return 0;
    }//线程句柄有效,说明上次线程已退出if(mTrdDown2 != INVALID_HANDLE_VALUE)
    {
    CloseHandle(mTrdDown2); //释放线程句柄
    mTrdDown2 = NULL;
    }
    }
    }
    if ( LOWORD(wParam) == IDCANCEL)
    {
    EndDialog(hDlg, LOWORD(wParam));
    return (INT_PTR)TRUE;
    }
    break;
    }
    return (INT_PTR)FALSE;
    }/* 设备事件通知回调程序,在此程序里不宜作过多的操作,主要是因为中断服务程序优先级高,
    不宜进行USB传输,通常只是发个消息或者置个全局变量通知主程序处理。*/
    VOID CALLBACK CH375NOTIFYROUTINE(  
    ULONG iEventStatus ){ //设备事件和当前状态: 0=设备拔出事件, 3=设备插入事件 if(iEventStatus==CH375_DEVICE_ARRIVAL){ //检测到设备插入事件SendMessage(hWndStatus,SB_SETTEXT,1,(LPARAM)TEXT("虎王USB_CAN设备已插入.")); //等效于单击打开设备按钮
    }
    else if(iEventStatus==CH375_DEVICE_REMOVE){ //检测到设备拔出事件SendMessage(hWndStatus,SB_SETTEXT,1,(LPARAM)TEXT("虎王USB_CAN设备已拔出."));//等效于单击打开设备按钮 
    if(DevHandle != INVALID_HANDLE_VALUE)
    ::SendDlgItemMessage(hWnd,ID_DO_OPEN,BM_CLICK,0,0); //等效于单击打开设备按钮 //等效于单击打开设备按钮 
    }
    return;
    }
    已经重新贴了出来。等会我把程序的截图发给你大家看下。然后给大家看下mfc做的样板。
    因为mfc还没有学习。线程也搞不定。但是因为这个东西马上要用。实属无奈。
    我先把mfc的线程代码发出来。void CCH372UpDownDlg::OnButton2Down() //端点2下传
    {
    UpdateData(TRUE);
    CWinThread * mTrdDown2 = NULL;
    if(!m_open) {
    MessageBox("请先打开设备!","DEBUG372",MB_OK|MB_ICONSTOP);
    return;
    }
    if(T2DHandle == INVALID_HANDLE_VALUE)
    {
    UCHAR DeviceName[128];
    memcpy(&DeviceName[0],CH375GetDeviceName(mIndex),sizeof(DeviceName));
    T2DHandle = CreateFile( (char *)&DeviceName[0], GENERIC_READ | GENERIC_WRITE,  // 打开设备
    FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
    if(T2DHandle == INVALID_HANDLE_VALUE)
    {
    MessageBox("无法打开设备!","DEBUG372",MB_OK|MB_ICONSTOP);
    return;
    }
    }

    //if(m_downlen2 == 0 || m_uplen2 > mCH375_PACKET_LENGTH*8*2 )
    if(m_uplen2 > mCH375_PACKET_LENGTH*64 )
    {
    MessageBox("批量下传数据长度一次最大为4096!","DEBUG372",MB_OK);
    return;
    }
    //线程句柄有效,说明上次线程已退出
    if(mTrdDown2 != INVALID_HANDLE_VALUE){
    CloseHandle(mTrdDown2); //释放线程句柄
    mTrdDown2 = NULL;
    }
        //建立线程
    mTrdDown2 = AfxBeginThread(mThreadDown2,this,THREAD_PRIORITY_NORMAL,0,0,NULL); 
    if(mTrdDown2)
    {
    m_trddown2 = TRUE; //线程启动标志
    }
    else
    {
    MessageBox("端点2下传线程启动失败","DEBUG372",MB_OK|MB_ICONSTOP);
    m_trddown2 = FALSE;
    return;
    }
    }UINT mThreadDown2(LPVOID pParam) //端点2下传线程
    {
    ULONG dlen,datalen;
    UCHAR mBuf[mCH375_PACKET_LENGTH*8]; CCH372UpDownDlg *pDlg = (CCH372UpDownDlg *)pParam;
    pDlg->m_btndown2.EnableWindow(FALSE);
    if(pDlg->m_open && pDlg->m_trddown2)
    {
    /**************在线程中用CreateFile打开设备,因为每个句柄同一时候只能执行一个API**************************/
    if ( pDlg->T2DHandle != INVALID_HANDLE_VALUE ) 
    {
    datalen = strlen(pDlg->m_downdata2);
    if((LONG)datalen/2 > pDlg->m_downlen2) //取数据长度与输入长度中偏小值
    datalen = pDlg->m_downlen2;
    else{
    datalen = datalen/2;
    pDlg->m_downlen2 = datalen;
    } memcpy(mBuf,pDlg->m_downdata2,datalen*2);
    pDlg->mStrtoVal(&mBuf[0],datalen*2);
    dlen = datalen; if(!CH375WriteData((ULONG)pDlg->T2DHandle,&mBuf[0],&dlen))
    {
    if ( !pDlg->m_close ) MessageBox(NULL,"端点2下传失败!如果设备断开过那么请先关闭本程序","DEBUG372",MB_OK|MB_ICONSTOP);
    }
    else{//更新长度显示
    char tem[50]="";
    DownCount=DownCount+dlen;
    sprintf(tem,"Down: %d",DownCount);
    SetDlgItemText(pDlg->m_hWnd,IDC_DownCount,tem);
    }
    }
    }
    pDlg->m_trddown2 = FALSE;
    pDlg->m_btndown2.EnableWindow(TRUE);
    //ExitThread(0);
    return 0;
    }以上是mfc的下传线程的代码。
    为了更好理解我把部分头文件贴出来。class CCH372UpDownDlg : public CDialog
    {
    // Construction
    public:
    void mCloseWin();
    // UCHAR DeviceName[128];
    BOOL m_trdup1;
    BOOL m_trdup2;
    BOOL m_trddown2;
    BOOL m_open;
    BOOL m_close;
    HANDLE T2DHandle;    //端点2下传设备打开句柄
    HANDLE T2UHandle;    //端点2上传设备打开句柄
    HANDLE T1Handle;  //端点1上传设备打开句柄 CCH372UpDownDlg(CWnd* pParent = NULL); // standard constructor
    UCHAR mCharToBcd(UCHAR iChar );
    PUCHAR mStrtoVal(PUCHAR str, ULONG strlen);
    // Dialog Data
    //{{AFX_DATA(CCH372UpDownDlg)
    enum { IDD = IDD_CH372UPDOWN_DIALOG };
    CButton m_btnup2;
    CButton m_btndown2;
    CButton m_btnup1;
    CListBox m_listup1;
    long m_uplen1;
    long m_uplen2;
    CString m_downdata2;
    long m_downlen2;
    //}}AFX_DATA // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CCH372UpDownDlg)
    public:
    virtual BOOL DestroyWindow();
    protected:
    virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
    //}}AFX_VIRTUAL// Implementation
    protected:
    HICON m_hIcon; // Generated message map functions
    //{{AFX_MSG(CCH372UpDownDlg)
    virtual BOOL OnInitDialog();
    afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
    afx_msg void OnPaint();
    afx_msg HCURSOR OnQueryDragIcon();
    afx_msg void OnButton2Down();
    afx_msg void OnButton2Up();
    afx_msg void OnButton1Up();
    afx_msg void OnClose();
    afx_msg void OnOpenCH375Device();
    afx_msg void OnCloseCH375Device();
    afx_msg void OnClearD2Data();
    afx_msg void OnClearU2Data();
    afx_msg void OnClearU1Data();
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
    };还有一个动态链接库。
      

  7.   

    俺前面说了,里面有好多东西别人没有,比如资源id和头文件。你最好把整个工程压缩一下传到csdn的下载区,然后把地址贴出来。
      

  8.   

    由于上传权限太小。所以上传到网盘了已经在115网络u盘。
    帐号[email protected]
    密码111111
    2个文件一个是我写的windwos api   USB_CAN
    一个是mfc的例子。  ch372
      

  9.   

    问题已经说了。
    在mfc的例子中建立线程向usb设备发送数据。如何在我的windows api中实现。
      

  10.   

    建一个批处理 clean.bat里面写上del *.ncb
    del *.opt
    del *.aps
    del *.plgdel debug\*.* /q
    del release\*.* /qrd debug
    rd release把没用的临时文件都清掉再上传吧,哪有工程文件就几十兆的,俺见过的也就几兆而已。
      

  11.   

    mfc是例子,我自己写的windows api。我没说mfc是我写的。我只是想实现跟mfc一样的功能而已。
    可能前面代码贴的太长。有些说明你没看清。。
      

  12.   

    上传已经完成了。。http://wojuwugu.download.csdn.net/这是下载地址。。请高手有时间帮我看看
      

  13.   

    求达人现身因为急于要实现效果。。因为软件马上要用。没学过mfc所以can372里面的建立线程什么的还有线程的描述我表示看不懂啊。求指导这个win32项目应该怎样实现跟mfc一样的功能。。
      

  14.   

    真是不错的代码, 是个很好的复习 sdk 窗口的样板, 而且风格很易懂,,, 谢谢楼主哈
      

  15.   

    我还真写不出来这么复杂的窗口程序。 被mfc害的呀。。楼主V5
    mTrdDown2 = AfxBeginThread(mThreadDown2,this,THREAD_PRIORITY_NORMAL,0,0,NULL); 
    把上面那句 改成HANDLE hThread = NULL;  // 要用全局的吗?线程参数改成一个结构体,里面记录着要调用的各种变量 和函数指针
    比如叫做 struct _sParam{……};hThread = CreateThread(NULL, 0, mThreadDown2, &param, 0, 0);  // 只能给线程传一个参数,param为 参数结构体mThreadDown2 这个线程函数改成
    UINT __stdcall mThreadDown2(LPVOID lparam)
    {
       struct _sParam param = (struct _sParam*) lparam;
       // 里面所用用到CCH372UpDownDlg的地方改成 param->调用
       ……
    }
      

  16.   

    整理目前的问题
    1.当务之急。仿照mfc的下传线程建立一个下传线程。
    2.发现在combobox控件中添加15个数字没有效果。只显示初始值0
    3.从edit 控件中获得数据并且发送到listview控件中不成功。
      

  17.   

    CAN总线的东西我做过
    当时就是用USB弄的
    因为方便
    不过你的问题应该和这个无关
    如果你就是不会多线程的话你可以看看这个系列
    http://www.vckbase.com/document/viewdoc/?id=1704
      

  18.   

    NND,代码真TMD多,我都看晕了,呵呵
      

  19.   

    看另一帖回帖吧,你可以直接把代码copy过去,有什么问题PM我
      

  20.   

    你好感谢关注。按照你说的我把代码copy过去。做了如下改动
    UINT mThreadDown2(LPVOID pParam)改为DWORD WINAPI mThreadDown2(LPVOID pParam)
    mTrdDown2 = AfxBeginThread(mThreadDown2,this,THREAD_PRIORITY_NORMAL,0,0,NULL);改为
    mTrdDown2 =CreateThread(NULL, 0, mThreadDown2,&param, 0, 0); 
    并且在头文件中加入了和mfc工程中一样的类
    出现了如下错误error LNK2019: 无法解析的外部符号 "public: unsigned char * __thiscall CCH372UpDownDlg::mStrtoVal(unsigned char *,unsigned long)" (?mStrtoVal@CCH372UpDownDlg@@QAEPAEPAEK@Z),该符号在函数 "unsigned long __stdcall mThreadDown2(void *)" (?mThreadDown2@@YGKPAX@Z) 中被引用
    1>D:\我的文档\Visual Studio 2010\Projects\USB_CAN\Debug\USB_CAN.exe : fatal error LNK1120: 1 个无法解析的外部命令
    1>
      

  21.   

    因为不需要进行长度判断所以我将进行长度比较的地方进行了删除。我只需要获得输入数据的长度并且通过sendmessage发送到我建立的listview中即可。这个可以以后再加。
      

  22.   

    因为mfc只有一个主窗口而我的是从一个非模态对话框进行发送所以在类中已经对id更改过了。
    // pDlg->m_btndown2.EnableWindow(FALSE);这样的mfc中按钮处理我也注释掉了,因为我的发送窗口不需要这样的按钮处理。
      

  23.   

    public: 
    unsigned char * __thiscall CCH372UpDownDlg::mStrtoVal(unsigned char *,unsigned long)这个函数 定义时错误,  把 __thiscall 去掉试一下。。 
      

  24.   

    你的SDK代码是纯C的,因此不要用类
      

  25.   

    我在项目属性中在mfc使用下‘共享dll使用mfc’
    类貌似可以使用了。。
      

  26.   

    mTrdDown2 =CreateThread(NULL, 0, mThreadDown2,&param, 0, 0);  
    我觉得目前已经运行了。因为在线程最后我加了一个messagebox看线程是否启动发现没有反映。
    第四个参数到底应该传递什么呢》??有点糊涂了。。
      

  27.   

    mfc中的this指针到底传递了哪些参数呢
      

  28.   

    这个地方我是将从edit控件里面的值发送给usb设备。我已经把这个值赋给了变量buffer1.是不是传递这个buffer呢?
      

  29.   

    现在我尝试用这种结构体来实现。但是结构体内部要传递的参数什么的不清楚求指导。应该是mfc中的头文件?
      

  30.   

    你的 那个对话框中有什么都不知道。。mThreadDown2 这个线程也没看到过 你应该 阅读 mThreadDown2 这个线程中的代码, 找出所有用到 那个对话框的地方,, 分离出参数,
    把参数写入 结构体中 应该也没啥参数, 无非是 一些 text int 等值而已