怎么用C++定义窗口?求帮忙!

我想使用Dev C++定义一个窗口,请问怎么实现?能不能把代码写一下,让我看看。

c++
phenix2009
白色一大坨 你好,如果有不明白可以加个联系方式,qq465617727
12 个月之前 回复

2个回答

进入 devC++, 选择新建->项目->Windows Applications。
他会自动给你生成一个 cpp 问价
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) 是主窗口消息处理函数
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) 是主函数
你把他的cpp文件编译运行即可。
如果你要是想知道如何添加控件,可以学习windows 消息机制,再浏览 MSDN。

这就需要勤学、苦学。
里面注释是英文的,可以上网查找每个函数的意思,这是个标准的模板,也就是每个窗体都要有这些处理过程。
如有不懂,可以继续问
望采纳,谢谢

#include <windows.h>

/* This is where all the input to the window goes to */
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) {
    switch(Message) {

        /* Upon destruction, tell the main thread to stop */
        case WM_DESTROY: {
            PostQuitMessage(0);
            break;
        }

        /* All other messages (a lot of them) are processed using default procedures */
        default:
            return DefWindowProc(hwnd, Message, wParam, lParam);
    }
    return 0;
}

/* The 'main' function of Win32 GUI programs: this is where execution starts */
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    WNDCLASSEX wc; /* A properties struct of our window */
    HWND hwnd; /* A 'HANDLE', hence the H, or a pointer to our window */
    MSG msg; /* A temporary location for all messages */

    /* zero out the struct and set the stuff we want to modify */
    memset(&wc,0,sizeof(wc));
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.lpfnWndProc   = WndProc; /* This is where we will send messages to */
    wc.hInstance     = hInstance;
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);

    /* White, COLOR_WINDOW is just a #define for a system color, try Ctrl+Clicking it */
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    wc.lpszClassName = "WindowClass";
    wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION); /* Load a standard icon */
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION); /* use the name "A" to use the project icon */

    if(!RegisterClassEx(&wc)) {
        MessageBox(NULL, "Window Registration Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
        return 0;
    }

    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,"WindowClass","Caption",WS_VISIBLE|WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, /* x */
        CW_USEDEFAULT, /* y */
        640, /* width */
        480, /* height */
        NULL,NULL,hInstance,NULL);

    if(hwnd == NULL) {
        MessageBox(NULL, "Window Creation Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
        return 0;
    }

    /*
        This is the heart of our program where all input is processed and 
        sent to WndProc. Note that GetMessage blocks code flow until it receives something, so
        this loop will not produce unreasonably high CPU usage
    */
    while(GetMessage(&msg, NULL, 0, 0) > 0) { /* If no error is received... */
        TranslateMessage(&msg); /* Translate key codes to chars if present */
        DispatchMessage(&msg); /* Send it to WndProc */
    }
    return msg.wParam;
}

你这个问题不明确,什么叫定义窗口,具体要实现什么,需要好好描述一下。

phenix2009
白色一大坨 回复python~新手: https://jingyan.baidu.com/article/3c343ff7a7965e0d3779630f.html就是创建个窗体呗
11 个月之前 回复
weixin_43212830
python自学者 我的意思是显示一个普通的窗口,不需要加什么控件,随便显示一个窗口都可以。简单些就好!
11 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
怎么用C++定义窗口?求帮忙!
我想使用Dev C++定义一个窗口,请问怎么实现?能不能把代码写一下,让我看看。
【c-WinAPI】 程序运行崩溃(自己写的函数出错),求大神帮忙!!!!
# 先行说明: ## 工程简要说明 说明下,这个工程一共5个文件(两个头文件,三个资源文件): 头文件中,一个是宏定义用文件【WinMacro.h】,另一个是函数声明用文件【WinHead.h】; 资源文件中,一个是窗口注册文件(基本可以忽略)【WinMain.c】,第二个是窗口过程文件【WinProc.c】,最后一个里是函数定义文件(主要出错的地方)【WinSupport.c】。 ## 编译器介绍 这里我用的是Dev c++ (v.5.11)编译器,有段时间入了学生联赛的坑,然后现在就有点停不下来,对VC没什么好感,emmm。 ## 对于ERROR的探索 我本来是希望用TextOut函数做一个模拟DrawText函数的新函数:TextPrint,后续还想给它添加一些独特的输出特效,不过现在看来都运行不了(一运行就立即报错,但是编译没问题),尴尬。 万恶的Dev c++调试功能有问题,找了很长时间解决办法之后,就调试了一下,结果就...完全看不懂了。 在下面我标注的【图6】第27行(WinSupport.c)这里单步调试会终止,并弹出显示: > program received signal SIGFPE, Airthmetic expection 然后会显示 Windows CPU 运行表(大概是这个叫法...),但还是看不懂。所以我后面修改了代码,把27、28行都改成了将那两个变量赋值为常数2,而不是即时计算。 顺便改了一下74行,把pcText换成了pChar (74行这里是自己发现的逻辑错误)。 现在各位看到的代码是最初的版本,上面的修改在下面附的代码里都未体现。不是说我懒的修改,而是因为我想把这里弄明白,到底是什么原因。 修改后的代码其实也有问题,那就是虽然可以运行,但是假如在一个矩形内输出了n(n>1)行,那么只有第一行能被保留(啊啊啊,要疯了!!!) ## 最终预期功能 嗯,这里在重申一下,那个TextPrint函数是低配版的DrawText函数,功能就是指定一个矩形,然后向矩形范围内输出(每行填满后自动换行)(假如要输出的内容填满了整个矩形都没有输出完,那就停止输出)。 ## 一些个人看法 自己也试了许多次,但就是不太清楚其中机理,只好劳烦各位“达人”了。 我是直接看书自学的WinAPI,没什么耐性,就先用刚学的新函数TextOut练练手, 所以...挖了个大坑。 个人感觉应该是WinAPI"可重入"的锅,但是实在是没有接触过面向对象的编程(只会一点C),so...... ## 致谢 (.-..-.)刚刚注册的号,学生党一枚,初次提问,言谢在先! # 源代码: 【WinMacro.h】: ```c #define CLASSNAME "Program: Get Seated" #define APPNAME "Tiny Spotlessness: The Seats" #define SIZE_101 SIZEOFSTRING #define SIZEOFSTRING 100 #define EMPTY INITIAL #define INITIAL 0 #define CXSCREEN GetSystemMetrics (SM_CXSCREEN) #define CYSCREEN GetSystemMetrics (SM_CYSCREEN) #define FAULTMSG_101 FAULTMSG_WNDNTNEEDED #define FAULTMSG_WNDNTNEEDED "Fault 101: WindowsNTneeded!" ``` 【图1】 ![图片说明](https://img-ask.csdn.net/upload/201907/06/1562392986_229499.png) 【WinHead.h】: ```c /*---------------------------------------------------------------- Supporting Header Files -----------------------------------------------------------------*/ #include <windows.h> #include <stdbool.h> #include "WinMacro.h" /*---------------------------------------------------------------- Supporting Value Structions -----------------------------------------------------------------*/ /*---------------------------------------------------------------- Supporting Function Statements -----------------------------------------------------------------*/ LRESULT CALLBACK WndProc ( /*--------------------------------------*/ HWND hwnd, /* Stating the Main Window Process, */ UINT message, /* a special function with four para- */ WPARAM wParam, /* meters, using the other functions. */ LPARAM lParam /*--------------------------------------*/ ); int TextPrint( /*--------------------------------------*/ HDC hdc, /* Print on any place of rect, using */ RECT *pRect, /* a pointer to rect and a pointer to */ const TEXTMETRIC *pTm, /* the text metric, a string with */ const TCHAR *pcText, /* its length, and return the number */ int iLenth /* of the characters outputted. */ ); ``` 【图2】 ![图片说明](https://img-ask.csdn.net/upload/201907/06/1562393250_936313.png) 【图3】 ![图片说明](https://img-ask.csdn.net/upload/201907/06/1562393275_813852.png) 【WinMain.c】: ```c /*-------------------------------------- WinMain.c, (c) Shen Pengfei, 2019 --------------------------------------*/ #include "WinHead.h" int WINAPI WinMain ( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow ) { TCHAR szClassName[] = TEXT (CLASSNAME); TCHAR szAppName[] = TEXT (APPNAME); HWND hwnd; MSG msg; WNDCLASS wndclass; wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = EMPTY; wndclass.cbWndExtra = EMPTY; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION); wndclass.hCursor = LoadCursor (NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH); wndclass.lpszClassName = szClassName; wndclass.lpszMenuName = NULL; if (!RegisterClass (&wndclass)) { MessageBox ( NULL, TEXT (FAULTMSG_WNDNTNEEDED), szAppName, MB_ICONERROR ); return EMPTY; } hwnd = CreateWindow ( szClassName, /* window class name */ szAppName, /* window caption name */ WS_OVERLAPPEDWINDOW | WS_VSCROLL, /* window style */ INITIAL, /* initial x position */ INITIAL, /* initial y position */ CXSCREEN, /* initial x size */ CYSCREEN, /* initial y size */ NULL, /* parent window handle */ NULL, /* window menu handle */ hInstance, /* program instance handle */ NULL /* creation parameters */ ); ShowWindow (hwnd, iCmdShow); UpdateWindow (hwnd); while (GetMessage (&msg, NULL, EMPTY, EMPTY)) { TranslateMessage (&msg); DispatchMessage (&msg); } return msg.wParam; } ``` 【图4】 ![图片说明](https://img-ask.csdn.net/upload/201907/06/1562393472_122237.png) 【图5】 ![图片说明](https://img-ask.csdn.net/upload/201907/06/1562393485_726445.png) 【WinSupport.c】: ```c /*------------------------------------------------ (c) Shen PengFei, 2019 A file to set up some functions to complite some special tasks. -------------------------------------------------*/ #include "WinHead.h" int TextPrint ( HDC hdc, RECT *pRect, const TEXTMETRIC *pTm, const TCHAR *pcText, int iLenth ) { static int iLine; static int iRaw; static int iCount; static const TCHAR *pChar; /*-------------------------------------------- Count the width and the Height of the screen, by the way, creating a pointer copying the address of initial string ---------------------------------------------*/ iLine = (pRect->right - pRect->left) / pTm->tmAveCharWidth; iRaw = (pRect->bottom - pRect->top) / (pTm->tmHeight + pTm->tmExternalLeading); pChar = pcText; for ( iCount = INITIAL; /*------------------------------------------------ To prevent the number of charaters outputt -ed on the screen from overring the string's, check if the result value of [PCHAR minus PCTEXT] was not larger than the length of the string. And also, to prevent the strin -g's overring the initial rect, check if the raw number over the max value counted and called IRAW. -------------------------------------------------*/ pChar - pcText < iLenth && iCount <= iRaw; /*------------------------------------------------ Change the outputting address of each raw, the position of the changed pointer to the string and Add the cyclelatte times value in turn each time, to end the running in time. -------------------------------------------------*/ pRect->top += pTm->tmHeight + pTm->tmExternalLeading, pChar += iLine, iCount ++ ) { /*----------------------------------------------- Solve the special condition that outputted characters' last raw is not enough to make the whole raw full, while may cause that the stuffs behind the address of the string fluent the system running. ------------------------------------------------*/ if ( iLenth % iLine != EMPTY && iCount == iLenth / iLine ) iLine = iLenth % iLine; TextOut ( hdc, pRect->left, pRect->top, pcText, iLine ); } /* Return the initial value used in turn */ pRect->left = pRect->top = INITIAL; return pChar - pcText; } ``` 【图6】 ![图片说明](https://img-ask.csdn.net/upload/201907/06/1562393526_633017.png) 【图7】 ![图片说明](https://img-ask.csdn.net/upload/201907/06/1562393538_23024.png) 【图8】 ![图片说明](https://img-ask.csdn.net/upload/201907/06/1562393576_200998.png) 【WinProc.c】: ```c /*----------------------------------------------- (c) Shen Pengfei, 2019 A file to create a series of windows, used by WINMAIN.C . ------------------------------------------------*/ #include "WinHead.h" LRESULT CALLBACK WndProc ( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) { static int cxChar; static int cyChar; static RECT rectPrint; static TCHAR szText [SIZEOFSTRING]; HDC hdc; RECT rect; PAINTSTRUCT ps; TEXTMETRIC tm; switch (message) { case WM_CREATE: rectPrint.left = INITIAL; rectPrint.top = INITIAL; rectPrint.right = CXSCREEN; rectPrint.bottom = CYSCREEN; hdc = GetDC (hwnd); /*----------------------------------------- To get the text parameters on its width and height (may with the external leading). ------------------------------------------*/ GetTextMetrics (hdc, &tm); cxChar = tm.tmAveCharWidth; cyChar = tm.tmHeight + tm.tmExternalLeading; ReleaseDC (hwnd, hdc); return EMPTY; case WM_SIZE : rectPrint.right = LOWORD (lParam); rectPrint.bottom = HIWORD (lParam); return EMPTY; case WM_PAINT: hdc = BeginPaint (hwnd, &ps); /* Debugging part */ TextPrint ( hdc, &rectPrint, &tm, szText, wsprintf ( szText, TEXT ("sdaf") ) ); EndPaint (hwnd, &ps); return EMPTY; case WM_DESTROY: PostQuitMessage (EMPTY); return EMPTY; } return DefWindowProc (hwnd, message, wParam, lParam); } ``` 【图9】 ![图片说明](https://img-ask.csdn.net/upload/201907/06/1562393610_312365.png) 【图10】 ![图片说明](https://img-ask.csdn.net/upload/201907/06/1562393619_968385.png)
急!MFC如何只显示子窗口的一部分
问题描述: 小弟最近在使用MFC做界面,遇上一个窗口嵌入显示的问题。 我有一个子窗口要嵌入父窗口的控件中。而且嵌入显示的时候只能显示窗口的指定区域。尝试了使用SetWindowPos()和SetWindowRgn()l两种方法。代码如下: 方法一: ``` void Show(CRect _rect, bool Mode) { MoveWindow(_rect, 1); if(!Mode) { CRect tmp; GetDlgItem(IDC_XXX)->GetClientRect(&_rect); SetWindowPos(NULL, _rect.left, _rect.top, _rect.Width(), _rect.Height(),SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER); } } ``` 方法一没有效果,窗口确实移动到了指定位置,然后我希望只显示控件部分大小,但是多余的部分不会隐藏起来,没有任何效果。 方法二: ``` void Show(CRect _rect, bool Mode) { MoveWindow(_rect, 1); if(!Mode) { CRect tmp; GetDlgItem(IDC_XXX)->GetClientRect(&tmp); CRgn _rgn; _rgn.CreateRectRgn(&_rect); this->SetWindow(_rgn); } } ``` 方法二可以实现想要的效果,但是反复创建CRgn对象会占用内存,而局部变量有无法删除,在类中定义一个变量的话,使用SetWindowRgn()设置一次后再设置第二次就会出错。求各位大佬给小弟帮帮忙!
求大神帮忙 谢谢
/** *############################################################################## * * [ 项目名 ] : 阳光酒店管理系统 * [ 公司名 ] : 清华IT * [ 模块名 ] : 系统登陆窗口 * [ 文件名 ] : Login.java * [ 相关文件 ] : * [ 文件实现功能] : 系统登陆窗口 * [ 作者 ] : 顾俊 * [ 版本 ] : 1.1 * ---------------------------------------------------------------------------- * [ 备注 ] : * ---------------------------------------------------------------------------- * [ 修改记录 ] : * * [ 日 期 ] [版本] [修改人] [修改内容] * 2006/04/02 1.0 顾俊 创建 * 2006/04/06 1.1 顾俊 增加注释 * 2006/04/19 1.2 顾俊 自动记录登录日志 * ##-------------------------------------------------------------------------- * 版权所有(c) 2006-2007, SunshineSOFT Corporation * --------------------------------------------------------------------------## * * [ 函数说明 ] : * * [## public Login() {} ]: * 功能: 构造函数 组建登录窗口 * * [## private void buildCenter() {} ]: * 功能: 组建用户名密码面板,仅类内使用 * * [## private void quit() {} ]: * 功能: 关闭系统函数,仅类内使用 * * [## private void dengLu() {} ]: * 功能: 密码验证通过,进入主操作界面,仅类内使用 * * [ 遗留问题 ] : * *############################################################################## */ package com.sunshine.login; import javax.swing.*; import javax.swing.border.*; import java.awt.*; import java.awt.event.*; import java.sql.*; import com.sunshine.sunsdk.sql.*; import com.sunshine.sunsdk.swing.*; import com.sunshine.sunsdk.system.*; import com.sunshine.mainframe.*; public class Login extends JFrame implements ActionListener, KeyListener, ItemListener, FocusListener { JLabel top, bott; JComboBox cb; JPasswordField pf; JButton bt1, bt2; JPanel panelMain, panelInfo; String clue = " 提 示 : "; int flag = 0; //登记次数记数器 /**=======================================================================** * [## public Login() {} ]: 构造函数 * 参数 :无 * 返回值 :无 * 修饰符 :public * 功能 :组建登录窗口 **=======================================================================** */ public Login() { super("系 统 登 录"); top = new JLabel (new ImageIcon("pic/login_top.gif")); bott = new JLabel(); panelMain = new JPanel(new BorderLayout(10, 10)); bott.setBorder(new LineBorder (new Color(184, 173, 151))); buildCenter(); panelMain.add("North", top); panelMain.add("South", bott); panelMain.add(panelInfo); //加事件监听 bt1.addActionListener(this); bt2.addActionListener(this); bt1.addFocusListener (this); bt2.addFocusListener (this); bt1.addKeyListener (this); bt2.addKeyListener (this); cb.addItemListener (this); cb.addFocusListener(this); pf.addFocusListener(this); cb.addKeyListener (this); pf.addKeyListener (this); //加窗口监听 new WindowAdapter适配器类 this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent we) { quit(); }//End windowClosing }); this.setContentPane(panelMain); //设置窗口面板 this.setSize(350, 235); this.setResizable (false); //设置窗口不可放大缩小 this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); sunswing.setWindowCenter(this); this.setVisible(true); pf.requestFocus(true); //设置焦点给密码框 } /**=======================================================================** * [## private void buildCenter() {} ]: 制作用户名密码面板 * 参数 :无 * 返回值 :无 * 修饰符 :private * 功能 :组建用户名密码面板,仅类内使用 **=======================================================================** */ private void buildCenter() { JLabel lb1, lb2; JPanel pa1, pa2, pa3; lb1 = new JLabel("用 户 名 :"); lb2 = new JLabel("登录密码 :"); cb = new JComboBox(); pf = new TJPasswordField (15); bt1 = new TJButton ("pic/key.gif", "登 录", "登录系统"); bt2 = new TJButton ("pic/exit.gif", "退 出", "关闭系统"); sunsql.initJComboBox (cb, "select userid from pwd where delmark=0"); //定义面板为无部局 panelInfo = new JPanel(null); //加入组件 panelInfo.add(lb1); panelInfo.add(lb2); panelInfo.add(cb); panelInfo.add(pf); panelInfo.add(bt1); panelInfo.add(bt2); lb1.setBounds(50,14,60,20); lb2.setBounds(50,48,60,20); bt1.setBounds(68,77,86,28); bt2.setBounds(186,77,86,28); cb.setBounds (115,12,168,23); pf.setBounds (115,46,170,23); //设定边框线 panelInfo.setBorder(BorderFactory.createTitledBorder("")); } /**=======================================================================** * [## private void quit() {} ]: 系统退出 * 参数 :无 * 返回值 :无 * 修饰符 :private * 功能 :关闭系统函数,仅类内使用 **=======================================================================** */ private void quit() { int flag = 0; String msg = "您 现 在 要 关 闭 系 统 吗 ?"; flag = JOptionPane.showConfirmDialog(null, msg, "提示", JOptionPane.YES_NO_OPTION); if(flag == JOptionPane.YES_OPTION) { this.setVisible(false); System.exit(0); }//End if(flag == JOptionPane.YES_OPTION) return; } /**=======================================================================** * [## private void dengLu() {} ]: 系统登录 * 参数 :无 * 返回值 :无 * 修饰符 :private * 功能 :密码验证通过,进入主操作界面,仅类内使用 **=======================================================================** */ private void dengLu() { String user = cb.getSelectedItem() + ""; String pwd = String.valueOf(pf.getPassword()); String code = "select pwd,puis from pwd where delmark=0 and userid='" + user + "'"; ResultSet rs = sunsql.executeQuery (code); try { if(rs.next()) { //用户名存在 if(pwd.equals(rs.getString(1))) { bott.setText(clue + "登录成功,正在进入系统 ..."); String puis = rs.getString(2); //获得操作员权限 boolean flag = Journal.writeJournalInfo(user, "登录本系统", Journal.TYPE_LG); if(flag) { //记录日志 new com.sunshine.mainframe.HotelFrame(user, puis); //进入主程序窗口(用户名, 权限) this.setVisible(false); }else { String msg = "写日志错误,请与系统管理员联系 ..."; JOptionPane.showMessageDialog(null, msg, "错误", JOptionPane.ERROR_MESSAGE); System.exit(0); } } else { bott.setText(clue + "用户 [ " + user + " ] 的密码不正确,请重新输入 ..."); flag++; if(flag == 3) { //三次密码验证 JOptionPane.showMessageDialog(null, "您不是本系统的管理员,系统关闭 ...", "警告", JOptionPane.ERROR_MESSAGE); System.exit(0); }//End if(flag == 3) return; }//End if(pwd.equals(rs.getString(1))) } else { bott.setText(clue + "用户ID [ " + user + " ] 不存在 ..."); }//End if(rs.next()) } catch (Exception ex) { ex.printStackTrace(); }//End try } /**=======================================================================** * ActionListener 监听 **=======================================================================** */ public void actionPerformed (ActionEvent ae) { //动作监听 if(ae.getSource() == bt1) { //登录按键 dengLu(); } else { quit(); }//End if(ae.getSource() == bt1) } /**=======================================================================** * ItemListener 监听 **=======================================================================** */ public void itemStateChanged (ItemEvent ie) { pf.requestFocus(true); } /**=======================================================================** * KeyListener 监听 **=======================================================================** */ public void keyPressed (KeyEvent ke) { //键盘按下监听 int key = ke.getKeyCode(); if(key == KeyEvent.VK_ENTER) { if(ke.getSource() == cb) pf.requestFocus(true); //将焦点从用户名给密码 if(pf.getPassword().length > 0) dengLu(); //按Enter键登录系统 } else if(key == KeyEvent.VK_ESCAPE) { //按ESC键退出系统 quit(); }//End if } public void keyReleased (KeyEvent ke) { //键盘释放监听 } public void keyTyped (KeyEvent ke) { //按键型监听 } /**=======================================================================** * FocusListener 监听 **=======================================================================** */ public void focusGained (FocusEvent fe) { //焦点监听 if(fe.getSource() == cb) //窗口最下方的功能提示 bott.setText(clue + "请选择操作员名称 ..."); else if(fe.getSource() == pf) bott.setText(clue + "请输入登录密码 ..."); else if(fe.getSource() == bt1) bott.setText(clue + "登录系统 ..."); else if(fe.getSource() == bt2) bott.setText(clue + "退出系统 ..."); } public void focusLost (FocusEvent fe) { //失去焦点监听 } /**=======================================================================** * [## public static void main(String sd[]) {} ]: 主函数 * 参数 :String sd[] * 返回值 :无 * 修饰符 :public static * 功能 :程序入口 **=======================================================================** */ public static void main(String sd[]) { sunswing.setWindowStyle(sunini.getIniKey("Sys_style").charAt(0)); new FStartWindow ("pic/Login.gif", new Frame(), 1200); new Login(); } } 下面是错误提示 The [ Sys_style ] Key is not exist!! Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0 at java.lang.String.charAt(Unknown Source) at com.sunshine.login.Login.main(Login.java:313)
为实现一个QQ聊天中的功能
我在QQ群里看到有人发视频,一点击就自动播放,视频还不能保存,点下面的标签就跳到加QQ群页面,标签文本还可以自定义,但是在聊天窗口外面看又是大吉大利QQ红包显示,这是怎么弄的?帮忙解决了我追加500C币![图片说明](https://img-ask.csdn.net/upload/201711/21/1511267708_936638.jpg)
c++大手进,新手求助!
c++大手帮忙,有一个方法,大手看看怎么用,再帮我推断下nEnd,nMakeSpac的意思,方法的作用是可以绘制窗体阴影,看了半天,也没理解前两个参数怎么用。winx-call是编译协议不用管,第四个参数是整型变量,后面的值是宏定义。这个方法作用是为窗口画阴影效果。 inline VOID winx_call DrawShadow( HDC hDCIn, HDC hDCOut, const RECT& rc, const INT cxShadow = WINX_SM_CXSHADOW) { int x; for ( x = 0; x < rc.right-1; x++ ) { int nEnd = ( x > rc.right-cxShadow*2 ) ? rc.right-cxShadow-x : cxShadow; for ( int y = ( x < 2 ) ? 2-x : x > rc.right-cxShadow-3 ? x-rc.right+cxShadow+3 : 0; y < nEnd; y++ ) { int nMakeSpec = 78+(3-(x==0?0:(x==1?(y<2?0:1):(x==2?(y<2?y:2):y))))*5; COLORREF cr = ::GetPixel(hDCIn, x+cxShadow, rc.bottom-y-1); COLORREF cr2 = RGB(((nMakeSpec * int(GetRValue(cr))) / 100), ((nMakeSpec * int(GetGValue(cr))) / 100), ((nMakeSpec * int(GetBValue(cr))) / 100)); ::SetPixel(hDCOut, x+cxShadow, rc.bottom-y-1, cr2); } } for ( x = 0; x < cxShadow; x++ ) { for ( int y = ( x < 2 ) ? 2-x : 0; y < rc.bottom-x-cxShadow-((x>0)?1:2); y++ ) { int nMakeSpec = 78+(3-(y==0?0:(y==1?(x<2?0:1):(y==2?(x<2?x:2):x))))*5; COLORREF cr = ::GetPixel (hDCIn, rc.right-x-1, y+cxShadow); COLORREF cr2 = RGB(((nMakeSpec * int(GetRValue(cr))) / 100), ((nMakeSpec * int(GetGValue(cr))) / 100), ((nMakeSpec * int(GetBValue(cr))) / 100)); ::SetPixel(hDCOut, rc.right-x-1, y+cxShadow, cr2); } } }
怎样使界面成为下面的样子,求好心人帮帮忙。。
![图片说明](https://img-ask.csdn.net/upload/201505/25/1432567966_854339.png) 源程序:import java.awt.*; import java.awt.event.*; import javax.swing.*; public class RecJFrame extends JFrame implements ActionListener,ComponentListener { private JRadioButton colorsbutton[]; //单选按钮组 private RecNCanvas canvas; //自定义画布组件 public RecJFrame() { super("图画—颜色"); //框架边布局 Dimension dim=getToolkit().getScreenSize(); //获得屏幕分辨率 this.setBounds(dim.width/4,dim.height/4,dim.width/2,dim.height/2); //窗口居中 this.setDefaultCloseOperation(EXIT_ON_CLOSE); this.addComponentListener(this); //注册组件事件监听器 JToolBar toolbar=new JToolBar(); //创建工具栏,默认水平方向 this.getContentPane().add(toolbar,"North"); //工具栏添加到框架内容窗格北部 JButton button_color = new JButton("选择颜色"); toolbar.add(button_color); button_color.addActionListener(this); String colors[]={"红","黄","蓝"}; ButtonGroup bgroup = new ButtonGroup(); //按钮组 colorsbutton = new JRadioButton[colors.length]; //单选按钮数组 for (int i=0; i<colorsbutton.length; i++) { colorsbutton[i]=new JRadioButton(colors[i]); //单选按钮 colorsbutton[i].addActionListener(this); bgroup.add(colorsbutton[i]); //单选按钮添加到按钮组 toolbar.add(colorsbutton[i]); //单选按钮添加到工具栏 } canvas = new RecNCanvas(); //创建自定义画布组件 this.getContentPane().add(canvas,"Center"); this.setVisible(true); //创建自定义画布组件this.getBackground()Color.yellow } public void actionPerformed(ActionEvent e) //按钮动作事件处理方法 { if(e.getActionCommand().equals("红")) { canvas.setColor(Color.red); } if(e.getActionCommand().equals("蓝")) { canvas.setColor(Color.blue); } if(e.getActionCommand().equals("黄")) { canvas.setColor(Color.yellow); } if (e.getActionCommand().equals("选择颜色")) { Color c=JColorChooser.showDialog(this,"选择颜色",Color.blue); //弹出JColorChooser颜色选择对话框,返回选中颜色 canvas.setColor(c); } canvas.repaint();//需要在这里加上repaint } public void componentHidden(ComponentEvent arg0) {} public void componentMoved(ComponentEvent arg0) {} public void componentResized(ComponentEvent arg0) {} public void componentShown(ComponentEvent arg0) {} public static void main(String arg[]) { new RecJFrame(); } } class RecNCanvas extends Canvas { private Color color; public void setColor(Color color) { this.color=color; } public void paint(Graphics g) { int x0=this.getWidth()/4; int y0=this.getHeight()/4; g.setColor(this.color); g.drawRect(x0,y0,250,100); } }
贪吃蛇语法有问题 求各位大神帮帮忙
``` #include<stdio.h> #include<stdlib.h> #include<conio.h> #include<string.h> #include<time.h> const char Shead = '@';//蛇头 const char Sbody = '#';//蛇身 const char Sfood = '*';//食物 const char Snode = '.';//地图的每一个node const int High = 8;//地图的高 const int Long = 16;//地图的宽度 char GameMap[High][Long];//地图 int Key; //按键保存 int Sum = 1;//蛇的结束 int Over = 0; //蛇的生命(死亡) int dy[4] = {0,0,-1,1};//上下左右 int dx[4] = {1,-1,0,0}; struct Snake //定义蛇的结构体 { int x; int y;//位置 int now;//保存当前节点的方向,为0 1 2 3 分别为上下左右 }Snake[High*Long] //蛇的最大大小(node) void Initial();//地图的初始化 void Create_Food(); //随机构造食物 void Show();//刷新并显示地图 void Button();//取出按键并且判断方向 void Move();// 蛇的移动 void Check_Border();//检查蛇头是否越界 void Check_Head(int x,int y); int main(void) { Initial(); show(); return 0; } void Initial()//地图的初始化 { int i,j; int hx,hy; system("title 贪吃蛇");//窗口的标题 memset(GameMap,'.',sizeof(GameMap));//把地图Initial为'.' system("cls"); srand(time(0));//随即的某个种子 hx = rand()%Long;//产生随即的蛇头 hy = rand()%High; GameMap[hx][hy] = Shead; //待测试 Snake[0].x = hx;//待测试 Snake[0].y = hy;//初始化随即的蛇头 Snake[0].now = -1;//初始化方向 Create_Food();//随即生成食物 for(i = 0;i < High;i++) //地图的显示 { for(j = 0;j < Long;j++) pritnf("%c",GameMap[i][j]); printf("\n"); } printf("霸气De蝈蝈★贪吃蛇小游戏!!!\n"); printf("按任意方向键开始游戏\n"); getch();//接受一个按键 Button();//取出输入的按键,并且判断方向 } void Create_Food() { int fx,fy; while(1) { fx = rand()%High; fy = rand()%Long; if(GameMap[fx][fy] == '.')//不能出现在蛇的身上 { GameMap[fx][fy] = Sfood; break; } } } void show()//刷新显示地图 { int i,j; while(1) { sleep(500);//延迟半秒刷新一次地图,1000为1s Button();//判断方向 Move(); // if(over) { printf("贪吃蛇死亡!\n"); printf("再来一次吧!\n"); getchar(); break; } system("cls");//清空地图并且显示地图 for(i = 0;i < High;i++) { for(j = 0;j <Long;j++) { printf("%c",GameMap[i][j]); printf("\n"); } } printf("霸气De蝈蝈★贪吃蛇小游戏!!!\n"); pritnf("按任意方向键开始游戏\n"); } } void Button() { if(kbhit =! 0) //kbhit检测是否输入按键,若有则返回一个非零值。 { while(kbhit =! 0) //可能存在许多的按键,要都取完,以最后一个为主 key = getch; switch(key) { case 75: Snake[0].now = 0;/*左*/ break; case 77: Snake[0].now = 1;/*右*/ break; case 72: Snake[0].now = 2;/*上*/ break; case 80: Snake[0].now = 3;/*下*/ break; } } } void Move()//蛇的移动 { int i,x,y; int t =sum;//保存蛇的节数 x = Snake[0].x; y = Snake[0].y; GameMap[x][y] = '.';//前进后设置蛇头为空 Snake[0].x = Snake[0].x + dx[Snake[0].now];//蛇头的移动 Snake[0].y = Snake[0].y + dy[Snake[0].now]; Check_Border();//判断是否越界 Check_Head(); //判断蛇头的目前坐标参数 if(sum = t)//如果未吃到食物,移动 { for(i = 1;i < sum; i++) { if(i == 1) //尾节点设置为空再移动 GameMap[ Snake[i].x ][ Snake[i].y ] = '.'; if(i = sum - 1) { Snake[i].x = x; Snake[i].y = y; Snake[i].now = Snake[0].now; } else { Snake[i].x = Snake[i+1].x; Snake[i].y = Snake[i+1].y; Snake[i].now = Snake[i+1].now; } GameMap[Snake[i].x][Snake[i].y] = '#'; } } void Check_Border() //检查蛇头是否越界 { if(Snake[0].x < 0 || Snake[0].x >= High || Snake[0].y < 0 || Snake[0].y >= Long) over = 1; } void Check_Head() { if(GameMap[ Snake[0].x ][ Snake[0].y ] == '.') //为空 GameMap[ Snake[0].x ][ Snake[0].y ] = '@'; else if(GameMap[ Snake[0].x ][ Snake[0].y ] == '*') //为食物 { GameMap[ Snake[0].x ][ Snake[0].y ] = '@'; Snake[sum].x = x; //新增加的蛇身为蛇头后面的那个 Snake[sum].y = y; Snake[sum].now = Snake[0].now; GameMap[ Snake[sum].x ][ Snake[sum].y ] = '#'; sum++; Create_Food(); //食物吃完了马上再产生一个食物 } else over = 1; } ```
WPF c#怎么在方法中调用XamGrid的cell的点击事件
# 现有需求:当给一览画面插入一行数据时,数据插入后自动启动这个数据的编辑画面。 为了使得列内容能够进行编辑利用了:TemplateColumn.ItemTemplate,自定义编辑画面使用:TemplateColumn.EditorTemplate 代码如下: ``` 代码如下: <Button x:Name="add"/> ------------给一览画面插入一行数据 <XamGrid x:Name="_decisionItemsGrid" Grid.Row="1" AutoGenerateColumns="True" HeaderTextHorizontalAlignment="Center"> <XamGrid.EditingSettings> <ig:EditingSettings AllowEditing="Cell" IsEnterKeyEditingEnabled="True" IsF2EditingEnabled="True" IsMouseActionEditingEnabled="SingleClick" IsOnCellActiveEditingEnabled="True" /> </XamGrid.EditingSettings> <ig:TemplateColumn Key="Directions" Width="60" HorizontalContentAlignment="Center" HeaderText="左右"> <ig:TemplateColumn.ItemTemplate> <DataTemplate> <TextBlock Width="Auto" HorizontalAlignment="Center" Text="{Binding Path=DirectionName, Mode=OneWay}" /> </DataTemplate> </ig:TemplateColumn.ItemTemplate> <ig:TemplateColumn.EditorTemplate> <DataTemplate> <idc:SelectDirections x:Name="_SelectDirections" --------自定义编辑窗口画面 Width="Auto" Height="Auto" DirectionName="{Binding Path=DirectionName, Mode=TwoWay}"/> </DataTemplate> </ig:TemplateColumn.EditorTemplate> </ig:TemplateColumn> </XamGrid> ``` 调查发现当编辑插入一览数据时,这个编辑画面根本就没有被初始化,无法自动启动。编辑画面只有在点击进入编辑状态时才进行初始化表示出来。 现在有想法就是: 1.cell是不是应该有个什么属性进行设置了就相当于在进行编辑,编辑画面就可以启动了。(不知道该怎么实现,Cells[2].IsActive=true,Cells[2].IsSelected=true都已经试过了,不能进入编辑状态) 2.怎么能够触发编辑cell的点击事件来进入编辑状态而启动编辑画面,但不知道该怎么去实现。 希望各位大神能够帮帮忙,看怎么能够实现!!!!或者有什么更好的替代方法。先谢谢了
新人求教,我用mfc做了一个tcp fin的端口扫描器,死后得不出结果,求大神帮忙找出问题
cpp文件 // scanDlg.cpp : implementation file // #include "stdafx.h" #include "scan.h" #include "scanDlg.h" #include "afxdialogex.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // CAboutDlg dialog used for App About class CAboutDlg : public CDialogEx { public: CAboutDlg(); // Dialog Data enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support // Implementation protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) END_MESSAGE_MAP() // CscanDlg dialog CscanDlg::CscanDlg(CWnd* pParent /*=NULL*/) : CDialogEx(CscanDlg::IDD, pParent) , m_star_port(_T("")) , m_end_port(_T("")) , m_IP(_T("")) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CscanDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_LIST1, m_list); DDX_Text(pDX, IDC_EDIT2, m_star_port); DDX_Text(pDX, IDC_EDIT3, m_end_port); DDX_Text(pDX, IDC_EDIT1, m_IP); } BEGIN_MESSAGE_MAP(CscanDlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BUTTON1, &CscanDlg::OnBnClickedButton1) END_MESSAGE_MAP() // CscanDlg message handlers BOOL CscanDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { BOOL bNameValid; CString strAboutMenu; bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here return TRUE; // return TRUE unless you set the focus to a control } hostent* CscanDlg::g_pHost = 0; SOCKET CscanDlg::sock = 0; void CscanDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialogEx::OnSysCommand(nID, lParam); } } // If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework. void CscanDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { CDialogEx::OnPaint(); } } // The system calls this function to obtain the cursor to display while the user drags // the minimized window. HCURSOR CscanDlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } void CscanDlg::OnBnClickedButton1() { // TODO: Add your control notification handler code here send_revc((LPSTR)(LPCTSTR)m_IP,(LPSTR)(LPCTSTR)m_star_port,(LPSTR)(LPCTSTR)m_end_port,&m_list);//char ch1[],char tr1[],char tr2[] } void CscanDlg ::send_revc(char ch1[],char tr1[],char tr2[],CListBox* m_list) { WSADATA WSAData; WSAStartup(MAKEWORD(2,2), &WSAData); sock=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAPPED);//定义套接字 BOOL flag = true; setsockopt(sock,IPPROTO_IP, IP_HDRINCL,(char *)&flag,sizeof(flag)); char sLocalName[64]; gethostname((char*)sLocalName, sizeof(sLocalName)-1); g_pHost = gethostbyname(sLocalName); sockaddr_in addr_local; addr_local.sin_addr = *(in_addr *)g_pHost->h_addr_list[0]; //绑定到本地网卡,INADDR_ANY不行 addr_local.sin_family = AF_INET;// addr_local.sin_port = htons(SOURCE_PORT); bind(sock, (PSOCKADDR)&addr_local, sizeof(sockaddr_in));//绑套接字 DWORD dwValue = 1; SADDR sAddr; USHORT int1,int2; sAddr.m_destip=ch1; sAddr.m_starpost=atoi(tr1); sAddr.m_endpost=atoi(tr2); ioctlsocket(sock, SIO_RCVALL, &dwValue); int nTimeOut = 500;//设置超时 setsockopt(sock,SOL_SOCKET, SO_SNDTIMEO, (char*)&nTimeOut, sizeof(nTimeOut)); HANDLE threads[2];//开双线程 threads[0] = CreateThread(NULL, 0,(LPTHREAD_START_ROUTINE)revcfunc,(LPVOID)m_list,0,NULL); threads[1] = CreateThread(NULL, 0,(LPTHREAD_START_ROUTINE)sendfunc,(LPVOID)(&sAddr), 0,NULL); WaitForMultipleObjects(2,threads,FALSE,INFINITE); } USHORT CscanDlg ::checksumfunc(USHORT *buffer, int size)//检验和函数 { unsigned long cksum=0; while(size >1) { cksum+=*buffer++; size -=sizeof(USHORT); } if(size) { cksum += *(UCHAR*)buffer; } cksum = (cksum >> 16) + (cksum & 0xffff); cksum += (cksum >>16); return (USHORT)(~cksum); } void CscanDlg ::sendfunc(SADDR* sAddr ) { IP_HEADER ipHeader; TCP_HEADER tcpHeader; PSD_HEADER psdHeader; char Sendto_Buff[MAX_BUFF_LEN]; //发送缓冲区 unsigned short check_Buff[MAX_BUFF_LEN]; //检验和缓冲区 const char tcp_send_data[]={"This is my homework of networt,I am happy!"}; BOOL flag; int rect,nTimeOver; //先试一下在外面弄好套接字初始化行不行 flag=true; nTimeOver=1000; //填充IP首部 ipHeader.h_verlen=(IPVER<<4 | sizeof(ipHeader)/sizeof(unsigned long)); ipHeader.tos=(UCHAR)0; ipHeader.total_len=htons((unsigned short)sizeof(ipHeader)+sizeof(tcpHeader)+sizeof(tcp_send_data)); ipHeader.ident=0; //16位标识 ipHeader.frag_and_flags=0; //3位标志位 ipHeader.ttl=128; //8位生存时间 ipHeader.proto=IPPROTO_UDP; //协议类型 ipHeader.checksum=0; //检验和暂时为0 ipHeader.sourceIP=*(int*)g_pHost->h_addr_list[0]; //32位源IP地址可以直接获取 ipHeader.destIP=inet_addr(sAddr->m_destip); //32位目的IP地址 //计算IP头部检验和 memset(check_Buff,0,MAX_BUFF_LEN); memcpy(check_Buff,&ipHeader,sizeof(IP_HEADER)); ipHeader.checksum=checksumfunc(check_Buff,sizeof(IP_HEADER)); //构造TCP伪首部 psdHeader.saddr=ipHeader.sourceIP; psdHeader.daddr=ipHeader.destIP; psdHeader.mbz=0; psdHeader.ptcl=ipHeader.proto; psdHeader.tcpl=htons(sizeof(TCP_HEADER)+sizeof(tcp_send_data)); for(int i=sAddr->m_starpost;i<sAddr->m_endpost;i++) //填充TCP首部 { tcpHeader.th_dport=htons(i); //16位目的端口号 tcpHeader.th_sport=htons(SOURCE_PORT); //16位源端口号 tcpHeader.th_seq=0; //SYN序列号 tcpHeader.th_ack=0; //ACK序列号置为0 //TCP长度和保留位 tcpHeader.th_lenres=(sizeof(tcpHeader)/sizeof(unsigned long)<<4|0); tcpHeader.th_flag=1; //修改这里来实现不同的标志位探测,2是SYN,1是//FIN,16是ACK探测 等等 tcpHeader.th_win=htons((unsigned short)16384); //窗口大小 tcpHeader.th_urp=0; //偏移大小 tcpHeader.th_sum=0; //检验和暂时填为0 //计算TCP校验和 memset(check_Buff,0,MAX_BUFF_LEN); memcpy(check_Buff,&psdHeader,sizeof(psdHeader)); memcpy(check_Buff+sizeof(psdHeader),&tcpHeader,sizeof(tcpHeader)); memcpy(check_Buff+sizeof(PSD_HEADER)+sizeof(TCP_HEADER), tcp_send_data,sizeof(tcp_send_data)); tcpHeader.th_sum=checksumfunc(check_Buff,sizeof(PSD_HEADER)+ sizeof(TCP_HEADER)+sizeof(tcp_send_data)); //填充发送缓冲区 memset(Sendto_Buff,0,MAX_BUFF_LEN); memcpy(Sendto_Buff,&ipHeader,sizeof(IP_HEADER)); memcpy(Sendto_Buff+sizeof(IP_HEADER),&tcpHeader, sizeof(TCP_HEADER)); memcpy(Sendto_Buff+sizeof(IP_HEADER)+sizeof(TCP_HEADER), tcp_send_data,sizeof(tcp_send_data)); int datasize=sizeof(IP_HEADER)+sizeof(TCP_HEADER)+ sizeof(tcp_send_data); //发送数据报的目的地址 SOCKADDR_IN dest; memset(&dest,0,sizeof(dest)); dest.sin_family=AF_INET; dest.sin_addr.s_addr=inet_addr(sAddr->m_destip); dest.sin_port=htons(i); rect=sendto(sock,Sendto_Buff,datasize, 0,(struct sockaddr*)&dest, sizeof(dest)); } } void CscanDlg ::revcfunc(CListBox* m_list) { CString str; char RecvBuf[MAX_BUFF_LEN]; IP_HEADER* ip; TCP_HEADER* tcp; while(1) { int ret = recv(sock, RecvBuf, MAX_BUFF_LEN, 0); if (ret > 0) { ip = (IP_HEADER*)RecvBuf; tcp = (TCP_HEADER*)(RecvBuf + (ip->h_verlen&0x0f)*4); str.Format(_T("%hu"), tcp->th_sport); m_list->AddString(str); } else str.Format(_T("%d"),ret),m_list->AddString(str); } } 头文件// scanDlg.h : header file // #pragma once #include<winsock2.h> #include<ws2tcpip.h> #include<stdio.h> #pragma comment(lib,"ws2_32.lib") //#define SIO_RCVALL_WSAIOW(IOC_VENDOR,1) #include <stdlib.h> #include <windows.h> #include <time.h> #include "afxwin.h" #define IPVER 4 //IP协议预定 #define MAX_BUFF_LEN 65500 //发送缓冲区最大值 #define SIO_RCVALL _WSAIOW(IOC_VENDOR,1) #define SOURCE_PORT 8088 //local TCP segment source port // CscanDlg dialog class CscanDlg : public CDialogEx { // Construction public: CscanDlg(CWnd* pParent = NULL); // standard constructor // Dialog Data enum { IDD = IDD_SCAN_DIALOG }; typedef struct ip_hdr //定义IP首部 { UCHAR h_verlen; //4位首部长度,4位IP版本号 UCHAR tos; //8位服务类型TOS USHORT total_len; //16位总长度(字节) USHORT ident; //16位标识 USHORT frag_and_flags; //3位标志位 UCHAR ttl; //8位生存时间 TTL UCHAR proto; //8位协议 (TCP, UDP 或其他) USHORT checksum; //16位IP首部校验和 ULONG sourceIP; //32位源IP地址 ULONG destIP; //32位目的IP地址 }IP_HEADER; typedef struct tsd_hdr //定义TCP伪首部 { ULONG saddr; //源地址 ULONG daddr; //目的地址 UCHAR mbz; //没用 UCHAR ptcl; //协议类型 USHORT tcpl; //TCP长度 }PSD_HEADER; typedef struct tcp_hdr //定义TCP首部 { USHORT th_sport; //16位源端口 USHORT th_dport; //16位目的端口 ULONG th_seq; //32位序列号 ULONG th_ack; //32位确认号 UCHAR th_lenres; //4位首部长度/6位保留字 UCHAR th_flag; //6位标志位 USHORT th_win; //16位窗口大小 USHORT th_sum; //16位校验和 USHORT th_urp; //16位紧急数据偏移量 }TCP_HEADER; typedef struct SADDR //定义TCP首部 { char* m_destip; USHORT m_starpost; USHORT m_endpost; }; USHORT static checksumfunc(USHORT *buffer, int size); void static sendfunc(SADDR* sAddr); void static revcfunc(CListBox* m_list); void send_revc(char ch1[],char tr1[],char tr2[],CListBox* m_list); SOCKET static sock; //用于收发TCP报文段的全局socket hostent static *g_pHost; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support // Implementation protected: HICON m_hIcon; // Generated message map functions virtual BOOL OnInitDialog(); afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); DECLARE_MESSAGE_MAP() public: CListBox m_list; afx_msg void OnBnClickedButton1(); CString m_star_port; CString m_end_port; CString m_IP; };
5道程序题,请各位大佬帮帮忙
程序题: 1. 请使用socket完成一个实现一个Peer模式的简单系统,该系统需包括:客户端和服务器端,需要实现文件上传、下载操作。 2. 请使用三层软件体系结构设计并实现ECHO协议的客户/服务器程序。要求给出三层软件体系结构面向链接的ECHO协议的客户和服务器程序的UML类图。 3. 请使用socket(C++ 或 JAVA)完成一个实现Peer模式的简单系统,该系统需包括:客户端和服务器端,需要实现文件上传、下载操作。要求: 客户端需要显示本地文件系统窗口; 服务器端显示服务器的文件系统窗口;客户端需要有文件上传的功能操作;服务器端需要有文件下载的功能操作。 4. 在Java语言环境下,通过RMI实现信息输入与查询功能程序,包括客户端与服务器端。要求:定义信息内容(姓名、性别、年龄、身份证号);完成客户端的有关信息的输入,并存入服务器端的数据库;完成服务器端的查询功能接口;完成客户端的查询功能。 5. 请使用三层软件体系结构设计并实现Daytime协议的客户/服务器程序。要求: Daytime协议是无状态还是有状态的?请给出面向链接的Daytime并发服务器程序。请给出面向链接的Daytime的客户端程序。 学分布式计算的题目……很难受……
matlab拿别人的程序跑时出现Attempt to reference field of non-structure array.
最近在做一个手写数字的程序,拿了别人的程序跑时发现在鼠标左键写完字后会点击右键会出现如下错误: >> MouseDraw MouseDraw right button down! Attempt to reference field of non-structure array. Error in MouseDraw (line 56) axes(FigHandle.Children),cla;%删除坐标图像 Error while evaluating figure WindowButtonDownFcn 源代码如下,请各位大神帮忙看看谢谢! function MouseDraw(action) %以Handle Graphics来设定滑鼠事件 %鼠标左键按下不放进行写字,右键进行识别 %(MouseDraw Events)的反应指令(Callbacks) % global不能传矩阵 %global用于定义全局变量,定义之后全局变量可作用于其他函数 global InitialX InitialY FigHandle %定义了三个变量 imSizex = 90; %定义图片的长度 imSizey = 120; %定义图片的宽度 %如果函数没有输入值的话,把action定义为start if nargin == 0 action = 'start'; end %进行判断actio是什么 switch(action) %%开启图形视窗 case 'start', FigHandle = figure('WindowButtonDownFcn','MouseDraw down');%figure函数用于新建一个窗口,此处获得它的句柄,第一个参数是在figure中点击时的回调函数 set(FigHandle,'position',[200,200,360,410] ); %设定图窗大小来适应识别的图片大小,设置的是中心坐标为200,横竖长度分别为360和410(或是各边离框的距离) %set(gca,'position',[0.1,0.1,0.5,0.8] ); %定 axis([1 imSizex 1 imSizey]); % 设定图轴范围 grid on; %添加网格线 box on; % 将图轴加上图框 title('手写体输入窗(左键写字 右键识别)'); dlmwrite('C:\Users\Administrator\Desktop\贝叶斯手写汉字识别\程序\IXT1.txt', -10, 'delimiter', '\t', 'precision', 6); dlmwrite('C:\Users\Administrator\Desktop\贝叶斯手写汉字识别\程序\IYT1.txt', -10, 'delimiter', '\t', 'precision', 6); %%滑鼠按钮被按下时的反应指令 case 'down', if strcmp(get(FigHandle, 'SelectionType'), 'normal') %如果是左键 set(FigHandle,'pointer','hand'); CurPiont = get(gca, 'CurrentPoint'); InitialX = CurPiont(1,1);%得到该点的两个数据并写入 InitialY = CurPiont(1,2); dlmwrite('C:\Users\Administrator\Desktop\贝叶斯手写汉字识别\程序\IXT1.txt', InitialX, '-append', 'delimiter', '\t', 'precision', 6); dlmwrite('C:\Users\Administrator\Desktop\贝叶斯手写汉字识别\程序\IYT1.txt', InitialY, '-append', 'delimiter', '\t', 'precision', 6); set(gcf, 'WindowButtonMotionFcn', 'MouseDraw move');%保存完数据后进行的某种设置 set(gcf, 'WindowButtonUpFcn', 'MouseDraw up');%按下后是起还是 elseif strcmp(get(FigHandle, 'SelectionType'), 'alt') % 如果是右键 set(FigHandle, 'Pointer', 'arrow'); set( FigHandle, 'WindowButtonMotionFcn', '') set(FigHandle, 'WindowButtonUpFcn', '') fprintf('MouseDraw right button down!\n'); ImageX = importdata('C:\Users\Administrator\Desktop\贝叶斯手写汉字识别\程序\IXT1.txt'); ImageY = importdata('C:\Users\Administrator\Desktop\贝叶斯手写汉字识别\程序\IYT1.txt'); InputImage = ones(imSizex,imSizey); roundX = round(ImageX); roundY = round(ImageY); for k = 1:size(ImageX,1) if 0<roundX(k) && roundX(k)<imSizex && 0<roundY(k) && roundY(k)<imSizey InputImage(roundX(k)-1:roundX(k)+2, roundY(k)-1:roundY(k)+2) = 0; end end InputImage = imrotate(InputImage,90); % 图像旋转90 axes(FigHandle.Children),cla;%删除坐标图像 delete('C:\Users\Administrator\Desktop\贝叶斯手写汉字识别\程序\IXT1.txt');%每次识别完要先删除,否则是根据上面的'-append'写入 delete('C:\Users\Administrator\Desktop\贝叶斯手写汉字识别\程序\IYT1.txt'); bayesBinaryTest(InputImage); %调用手写体识别函数 imwrite(InputImage,'C:\Users\Administrator\Desktop\贝叶斯手写汉字识别\程序\图片.bmp'); end %%滑鼠移动时的反应指令 case 'move', CurPiont = get(gca, 'CurrentPoint'); X = CurPiont(1,1); Y = CurPiont(1,2); % 当鼠标移动较快时,不会出现离散点。 % 利用y=kx+b直线方程实现。 x_gap = 0.1; % 定义x方向增量 y_gap = 0.1; % 定义y方向增量 if X > InitialX step_x = x_gap; else step_x = -x_gap; end if Y > InitialY step_y = y_gap; else step_y = -y_gap; end % 定义x,y的变化范围和步长 if abs(X-InitialX) < 0.01 % 线平行于y轴,即斜率不存在时 iy = InitialY:step_y:Y; ix = X.*ones(1,size(iy,2)); else ix = InitialX:step_x:X ; % 定义x的变化范围和步长 % 当斜率存在,即k = (Y-InitialY)/(X-InitialX) ~= 0 iy = (Y-InitialY)/(X-InitialX).*(ix-InitialX)+InitialY; end ImageX = [ix, X]; ImageY = cat(2, iy, Y); line(ImageX,ImageY, 'marker', '.', 'markerSize',18, ... 'LineStyle', '-', 'LineWidth', 2, 'Color', 'Black'); dlmwrite('C:\Users\Administrator\Desktop\贝叶斯手写汉字识别\程序\IXT1.txt', ImageX, '-append', 'delimiter', '\t', 'precision', 6); dlmwrite('C:\Users\Administrator\Desktop\贝叶斯手写汉字识别\程序\IYT1.txt', ImageY, '-append', 'delimiter', '\t', 'precision', 6); InitialX = X; %记住当前点坐标 InitialY = Y; %记住当前点坐标 %%滑鼠按钮被释放时的反应指令 case 'up', % 清除滑鼠移动时的反应指令 set(gcf, 'WindowButtonMotionFcn', ''); % 清除滑鼠按钮被释放时的反应指令 set(gcf, 'WindowButtonUpFcn', ''); end
大神帮忙 谢谢
/** *############################################################################## * * [ 项目名 ] : 阳光酒店管理系统 * [ 公司名 ] : 清华IT * [ 模块名 ] : 系统登陆窗口 * [ 文件名 ] : Login.java * [ 相关文件 ] : * [ 文件实现功能] : 系统登陆窗口 * [ 作者 ] : 顾俊 * [ 版本 ] : 1.1 * ---------------------------------------------------------------------------- * [ 备注 ] : * ---------------------------------------------------------------------------- * [ 修改记录 ] : * * [ 日 期 ] [版本] [修改人] [修改内容] * 2006/04/02 1.0 顾俊 创建 * 2006/04/06 1.1 顾俊 增加注释 * 2006/04/19 1.2 顾俊 自动记录登录日志 * ##-------------------------------------------------------------------------- * 版权所有(c) 2006-2007, SunshineSOFT Corporation * --------------------------------------------------------------------------## * * [ 函数说明 ] : * * [## public Login() {} ]: * 功能: 构造函数 组建登录窗口 * * [## private void buildCenter() {} ]: * 功能: 组建用户名密码面板,仅类内使用 * * [## private void quit() {} ]: * 功能: 关闭系统函数,仅类内使用 * * [## private void dengLu() {} ]: * 功能: 密码验证通过,进入主操作界面,仅类内使用 * * [ 遗留问题 ] : * *############################################################################## */ package com.sunshine.login; import javax.swing.*; import javax.swing.border.*; import java.awt.*; import java.awt.event.*; import java.sql.*; import com.sunshine.sunsdk.sql.*; import com.sunshine.sunsdk.swing.*; import com.sunshine.sunsdk.system.*; import com.sunshine.mainframe.*; public class Login extends JFrame implements ActionListener, KeyListener, ItemListener, FocusListener { JLabel top, bott; JComboBox cb; JPasswordField pf; JButton bt1, bt2; JPanel panelMain, panelInfo; String clue = " 提 示 : "; int flag = 0; //登记次数记数器 /**=======================================================================** * [## public Login() {} ]: 构造函数 * 参数 :无 * 返回值 :无 * 修饰符 :public * 功能 :组建登录窗口 **=======================================================================** */ public Login() { super("系 统 登 录"); top = new JLabel (new ImageIcon("pic/login_top.gif")); bott = new JLabel(); panelMain = new JPanel(new BorderLayout(10, 10)); bott.setBorder(new LineBorder (new Color(184, 173, 151))); buildCenter(); panelMain.add("North", top); panelMain.add("South", bott); panelMain.add(panelInfo); //加事件监听 bt1.addActionListener(this); bt2.addActionListener(this); bt1.addFocusListener (this); bt2.addFocusListener (this); bt1.addKeyListener (this); bt2.addKeyListener (this); cb.addItemListener (this); cb.addFocusListener(this); pf.addFocusListener(this); cb.addKeyListener (this); pf.addKeyListener (this); //加窗口监听 new WindowAdapter适配器类 this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent we) { quit(); }//End windowClosing }); this.setContentPane(panelMain); //设置窗口面板 this.setSize(350, 235); this.setResizable (false); //设置窗口不可放大缩小 this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); sunswing.setWindowCenter(this); this.setVisible(true); pf.requestFocus(true); //设置焦点给密码框 } /**=======================================================================** * [## private void buildCenter() {} ]: 制作用户名密码面板 * 参数 :无 * 返回值 :无 * 修饰符 :private * 功能 :组建用户名密码面板,仅类内使用 **=======================================================================** */ private void buildCenter() { JLabel lb1, lb2; JPanel pa1, pa2, pa3; lb1 = new JLabel("用 户 名 :"); lb2 = new JLabel("登录密码 :"); cb = new JComboBox(); pf = new TJPasswordField (15); bt1 = new TJButton ("pic/key.gif", "登 录", "登录系统"); bt2 = new TJButton ("pic/exit.gif", "退 出", "关闭系统"); sunsql.initJComboBox (cb, "select userid from pwd where delmark=0"); //定义面板为无部局 panelInfo = new JPanel(null); //加入组件 panelInfo.add(lb1); panelInfo.add(lb2); panelInfo.add(cb); panelInfo.add(pf); panelInfo.add(bt1); panelInfo.add(bt2); lb1.setBounds(50,14,60,20); lb2.setBounds(50,48,60,20); bt1.setBounds(68,77,86,28); bt2.setBounds(186,77,86,28); cb.setBounds (115,12,168,23); pf.setBounds (115,46,170,23); //设定边框线 panelInfo.setBorder(BorderFactory.createTitledBorder("")); } /**=======================================================================** * [## private void quit() {} ]: 系统退出 * 参数 :无 * 返回值 :无 * 修饰符 :private * 功能 :关闭系统函数,仅类内使用 **=======================================================================** */ private void quit() { int flag = 0; String msg = "您 现 在 要 关 闭 系 统 吗 ?"; flag = JOptionPane.showConfirmDialog(null, msg, "提示", JOptionPane.YES_NO_OPTION); if(flag == JOptionPane.YES_OPTION) { this.setVisible(false); System.exit(0); }//End if(flag == JOptionPane.YES_OPTION) return; } /**=======================================================================** * [## private void dengLu() {} ]: 系统登录 * 参数 :无 * 返回值 :无 * 修饰符 :private * 功能 :密码验证通过,进入主操作界面,仅类内使用 **=======================================================================** */ private void dengLu() { String user = cb.getSelectedItem() + ""; String pwd = String.valueOf(pf.getPassword()); String code = "select pwd,puis from pwd where delmark=0 and userid='" + user + "'"; ResultSet rs = sunsql.executeQuery (code); try { if(rs.next()) { //用户名存在 if(pwd.equals(rs.getString(1))) { bott.setText(clue + "登录成功,正在进入系统 ..."); String puis = rs.getString(2); //获得操作员权限 boolean flag = Journal.writeJournalInfo(user, "登录本系统", Journal.TYPE_LG); if(flag) { //记录日志 new com.sunshine.mainframe.HotelFrame(user, puis); //进入主程序窗口(用户名, 权限) this.setVisible(false); }else { String msg = "写日志错误,请与系统管理员联系 ..."; JOptionPane.showMessageDialog(null, msg, "错误", JOptionPane.ERROR_MESSAGE); System.exit(0); } } else { bott.setText(clue + "用户 [ " + user + " ] 的密码不正确,请重新输入 ..."); flag++; if(flag == 3) { //三次密码验证 JOptionPane.showMessageDialog(null, "您不是本系统的管理员,系统关闭 ...", "警告", JOptionPane.ERROR_MESSAGE); System.exit(0); }//End if(flag == 3) return; }//End if(pwd.equals(rs.getString(1))) } else { bott.setText(clue + "用户ID [ " + user + " ] 不存在 ..."); }//End if(rs.next()) } catch (Exception ex) { ex.printStackTrace(); }//End try } /**=======================================================================** * ActionListener 监听 **=======================================================================** */ public void actionPerformed (ActionEvent ae) { //动作监听 if(ae.getSource() == bt1) { //登录按键 dengLu(); } else { quit(); }//End if(ae.getSource() == bt1) } /**=======================================================================** * ItemListener 监听 **=======================================================================** */ public void itemStateChanged (ItemEvent ie) { pf.requestFocus(true); } /**=======================================================================** * KeyListener 监听 **=======================================================================** */ public void keyPressed (KeyEvent ke) { //键盘按下监听 int key = ke.getKeyCode(); if(key == KeyEvent.VK_ENTER) { if(ke.getSource() == cb) pf.requestFocus(true); //将焦点从用户名给密码 if(pf.getPassword().length > 0) dengLu(); //按Enter键登录系统 } else if(key == KeyEvent.VK_ESCAPE) { //按ESC键退出系统 quit(); }//End if } public void keyReleased (KeyEvent ke) { //键盘释放监听 } public void keyTyped (KeyEvent ke) { //按键型监听 } /**=======================================================================** * FocusListener 监听 **=======================================================================** */ public void focusGained (FocusEvent fe) { //焦点监听 if(fe.getSource() == cb) //窗口最下方的功能提示 bott.setText(clue + "请选择操作员名称 ..."); else if(fe.getSource() == pf) bott.setText(clue + "请输入登录密码 ..."); else if(fe.getSource() == bt1) bott.setText(clue + "登录系统 ..."); else if(fe.getSource() == bt2) bott.setText(clue + "退出系统 ..."); } public void focusLost (FocusEvent fe) { //失去焦点监听 } /**=======================================================================** * [## public static void main(String sd[]) {} ]: 主函数 * 参数 :String sd[] * 返回值 :无 * 修饰符 :public static * 功能 :程序入口 **=======================================================================** */ public static void main(String sd[]) { sunswing.setWindowStyle(sunini.getIniKey("Sys_style").charAt(0)); new FStartWindow ("pic/Login.gif", new Frame(), 1200); new Login(); } } 错误提示: Load CONFIG.INI is false!! The [ Sys_style ] Key is not exist!! Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0 at java.lang.String.charAt(Unknown Source) at com.sunshine.login.Login.main(Login.java:313)
代码最后用lambda表达式写的方法出现了问题,帮忙搞定一下吧(自己写的计算器的代码)
``` import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.Font; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JTextField; import javax.swing.border.LineBorder; interface Calculable { double CalculateInt(double x, double y); }// 用来定义Lambda表达式的接口 public class Mycalc extends JFrame { private static final long serialVersionUID = 1L; // 用来保存第一个数 private String number1 = ""; // 用来保存第二个数 private String number2 = ""; // 用来保存两个数的运算符 private String operator = ""; // 显示框 JTextField jt = new JTextField("0.0 "); public Mycalc() { setTitle("My first Calc"); setSize(600, 750); setLayout(null); SetCenter(this); setResizable(false); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); addJT(); addButton(); setVisible(true); } void addJT() {// 添加显示框 jt.setBounds(0, 0, 600, 150); // 不允许对显示框进行编辑 jt.setEditable(false); // 显示框内的数据右对齐 jt.setHorizontalAlignment(JTextField.RIGHT); // 设置背景色 jt.setBackground(new Color(100, 100, 100)); // 设置字体属性 jt.setFont(new Font("宋体", Font.BOLD, 20)); add(jt);// 添加 } void addButton() {// 添加操作按钮 JButton jb_7 = new JButton("7"); // 设置按钮边框的属性 jb_7.setBorder(new LineBorder(Color.BLUE, 1)); // 设置按钮的字体属性 jb_7.setFont(new Font("宋体", Font.BOLD, 20)); // 设置按钮的位置及大小 jb_7.setBounds(0, 150, 150, 150); // 添加数字监听者 jb_7.addActionListener(new NumberBtListener()); add(jb_7);// 添加 JButton jb_8 = new JButton("8"); jb_8.setBorder(new LineBorder(Color.BLUE, 1)); jb_8.setFont(new Font("宋体", Font.BOLD, 20)); jb_8.setBounds(150, 150, 150, 150); jb_8.addActionListener(new NumberBtListener()); add(jb_8); JButton jb_9 = new JButton("9"); jb_9.setBorder(new LineBorder(Color.BLUE, 1)); jb_9.setFont(new Font("宋体", Font.BOLD, 20)); jb_9.setBounds(300, 150, 150, 150); jb_9.addActionListener(new NumberBtListener()); add(jb_9); JButton jb_add = new JButton("+"); jb_add.setBounds(450, 150, 150, 150); jb_add.setBorder(new LineBorder(Color.BLUE, 1)); jb_add.setFont(new Font("宋体", Font.BOLD, 20)); jb_add.addActionListener(new Operation()); add(jb_add); JButton jb_4 = new JButton("4"); jb_4.setBorder(new LineBorder(Color.BLUE, 1)); jb_4.setFont(new Font("宋体", Font.BOLD, 20)); jb_4.setBounds(0, 300, 150, 150); jb_4.addActionListener(new NumberBtListener()); add(jb_4); JButton jb_5 = new JButton("5"); jb_5.setBorder(new LineBorder(Color.BLUE, 1)); jb_5.setFont(new Font("宋体", Font.BOLD, 20)); jb_5.setBounds(150, 300, 150, 150); jb_5.addActionListener(new NumberBtListener()); add(jb_5); JButton jb_6 = new JButton("6"); jb_6.setBorder(new LineBorder(Color.BLUE, 1)); jb_6.setFont(new Font("宋体", Font.BOLD, 20)); jb_6.setBounds(300, 300, 150, 150); jb_6.addActionListener(new NumberBtListener()); add(jb_6); JButton jb_cut = new JButton("-"); jb_cut.setBounds(450, 300, 150, 150); jb_cut.setBorder(new LineBorder(Color.BLUE, 1)); jb_cut.setFont(new Font("宋体", Font.BOLD, 20)); jb_cut.addActionListener(new Operation()); add(jb_cut); JButton jb_1 = new JButton("1"); jb_1.setBorder(new LineBorder(Color.BLUE, 1)); jb_1.setFont(new Font("宋体", Font.BOLD, 20)); jb_1.setBounds(0, 450, 150, 150); jb_1.addActionListener(new NumberBtListener()); add(jb_1); JButton jb_2 = new JButton("2"); jb_2.setBorder(new LineBorder(Color.BLUE, 1)); jb_2.setFont(new Font("宋体", Font.BOLD, 20)); jb_2.setBounds(150, 450, 150, 150); jb_2.addActionListener(new NumberBtListener()); add(jb_2); JButton jb_3 = new JButton("3"); jb_3.setBorder(new LineBorder(Color.BLUE, 1)); jb_3.setFont(new Font("宋体", Font.BOLD, 20)); jb_3.setBounds(300, 450, 150, 150); jb_3.addActionListener(new NumberBtListener()); add(jb_3); JButton jb_ride = new JButton("*"); jb_ride.setBounds(450, 450, 150, 150); jb_ride.setBorder(new LineBorder(Color.BLUE, 1)); jb_ride.setFont(new Font("宋体", Font.BOLD, 20)); jb_ride.addActionListener(new Operation()); add(jb_ride); JButton jb_0 = new JButton("0"); jb_0.setBorder(new LineBorder(Color.BLUE, 1)); jb_0.setFont(new Font("宋体", Font.BOLD, 20)); jb_0.setBounds(0, 600, 150, 150); jb_0.addActionListener(new NumberBtListener()); add(jb_0); JButton jb_equal = new JButton("="); jb_equal.setBounds(150, 600, 150, 150); jb_equal.setBorder(new LineBorder(Color.BLUE, 1)); jb_equal.setFont(new Font("宋体", Font.BOLD, 20)); jb_equal.addActionListener(new ClearOrEqual()); add(jb_equal); JButton jb_C = new JButton("C"); jb_C.setBounds(300, 600, 150, 150); jb_C.setBorder(new LineBorder(Color.BLUE, 1)); jb_C.setFont(new Font("宋体", Font.BOLD, 20)); jb_C.addActionListener(new ClearOrEqual()); add(jb_C); JButton jb_divide = new JButton("/"); jb_divide.setBounds(450, 600, 150, 150); jb_divide.setBorder(new LineBorder(Color.BLUE, 1)); jb_divide.setFont(new Font("宋体", Font.BOLD, 20)); jb_divide.addActionListener(new Operation()); add(jb_divide); } public static void main(String[] args) { new Mycalc(); } // 让主窗口最初在屏幕的中间显示 void SetCenter(Component cp) { // 得到屏幕的长度和宽度 Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); int screenheight = dim.height; int screenwidth = dim.width; int x = (screenwidth - cp.getWidth()) / 2; int y = (screenheight - cp.getHeight()) / 2; cp.setLocation(x, y); } /**对数字按钮进行事件监听 * 当未对运算符进行设置时,进行对第一个数的数值进行输入 * 运算符不为空时,对第二个数的数据进行输入 */ class NumberBtListener implements ActionListener { public void actionPerformed(ActionEvent e) { JButton jbt = (JButton) e.getSource(); String content = jbt.getText(); if (!operator.equals("")) { number1 += content; int number = Integer.valueOf(number1); jt.setText(number + " "); } else { number2 += content; int number = Integer.valueOf(number2); jt.setText(number + " "); } } } // 得出运算结果和清空显示框的监听者 class ClearOrEqual implements ActionListener { public void actionPerformed(ActionEvent e) { JButton jbt = (JButton) e.getSource(); String content = jbt.getText(); // number用来存放两个数运算的结果 double number = 0; // num1用来得到第一个数的数值 double num1 = Double.parseDouble(number1); // num2用来得到第二个数的数值 double num2 = Double.parseDouble(number2); // 得到此时运算的方法 Calculable cal = Calculate(operator); switch (content) { case "=": { if (!(operator.equals("") && number2.equals(""))) { // 运算完成 number = cal.CalculateInt(num1, num2); // 将运算完的数值再送给number1 //在多次点击‘=’时,可以进行多次运算 number1 = String.valueOf(number); jt.setText(number + " "); } } break; case "C": { jt.setText("0"); number1 = ""; number2 = ""; operator = ""; } break; } } } // 对运算符按钮进行监听的监听者 class Operation implements ActionListener { public void actionPerformed(ActionEvent e) { JButton jbt = (JButton) e.getSource(); String content = jbt.getText(); // 将按钮的运算符送给operator operator = content; // 将number2置空 number2 = ""; } } // 利用lambda表达式求运算方法 public static Calculable Calculate(String str) { Calculable result; switch (str) { case "+": { result = (x, y) -> (x + y); } break; case "-": { result = (x, y) -> (x - y); } break; case "*": { result = (x, y) -> (x * y); } break; case "/": { result = (x, y) -> (x / y); } break; } return result; } } ```
【求助】MSAA IAccessible接口枚举信息不全
背景: 针对某券商客户端(招商证券/中信证券通达信版本均可测试)做一个自动交易的辅助程序,对按钮,列表各种控件进行自动化控制操作,主要通过MSAA api来完成. 现在碰到了一个问题,请教下各位. 问题: 利用IAccessible接口遍历窗口,遍历的数据不全,和用工具AccCheckUI/AccExplorer32/AccViewer遍历的数据比起来,不一样有缺少,遍历的代码网上抄来的,改了下,自己调试了好久没找到原因,请大家帮忙找找原因 ![图片说明](https://img-ask.csdn.net/upload/201612/17/1481940339_792846.png) 如图所示,"买入","卖出"都是窗口"MainViewBar",自定义类MHPToolBar下子元素,用工具AccViewer可以找到"买入"的层次关系,但自己的遍历代码无法找到role是"工具栏"的对象,找到的role=菜单栏,数据都不对了. 主要代码如下: ``` //查找自定义类MHPToolBar窗口句柄 HWND hwnd = ::FindWindow(_T("TdxW_MainFrame_Class"), NULL); if (hwnd) { OFindWnd oWnd(hwnd, _T("MHPToolBar"), _T("MainViewBar")); hwnd = oWnd.m_hWnd; } if (!::IsWindow(hwnd)) return FALSE; //枚举并查找"买入"控件 IAccessible *pIAcc = NULL; HRESULT hr = AccessibleObjectFromWindow(hwnd, OBJID_WINDOW, IID_IAccessible, (void**)&pIAcc); if (SUCCEEDED(hr) && pIAcc) { VARIANT varChild; VariantInit(&varChild); IAccessible *pIAccChild = NULL; g_sSubPrefix = ""; if (CXMSAALib::FindAccessible(pIAcc, _T("买入"), _T("按下按钮"), _T("MHPToolBar"), &pIAccChild, &varChild)) { //find DEBUGTRACE("find"); } else { //not find DEBUGTRACE("not find"); } } BOOL CXMSAALib::FindAccessible(IAccessible* accParent, LPTSTR szName, LPTSTR szRole, LPTSTR szClass, IAccessible** paccChild, VARIANT* pvarChild) { BOOL found = false; TCHAR szObjName[MAX_PATH], szObjRole[MAX_PATH], szObjClass[MAX_PATH], szObjState[MAX_PATH]; IAccessible* pCAcc = NULL; VARIANT* vt_output = NULL; if (accParent == NULL) return FALSE; long lChildCount = 0; HRESULT hr = accParent->get_accChildCount(&lChildCount); if (FAILED(hr) || (lChildCount == 0)) return FALSE; DEBUGTRACE("%s obj=0x%p, numChildren=%d", g_sSubPrefix.c_str(), accParent, lChildCount); vt_output = new VARIANT[lChildCount]; for (int i = 0; i < lChildCount; i++) VariantInit(&vt_output[i]); long lNewChildCount = 0; hr = AccessibleChildren(accParent, 0, lChildCount, vt_output, &lNewChildCount); if (FAILED(hr)) goto exit; for (int j = 0; j < lNewChildCount && !found; j++) { VARIANT varChild; VariantInit(&varChild); IDispatch* disp = NULL; pCAcc = NULL; //If the vt member of an array element is VT_DISPATCH, //then the pdispVal member for that element is the address of the child object's IDispatch interface. if (vt_output[j].vt == VT_DISPATCH) { disp = vt_output[j].pdispVal; } //If the vt member of an array element is VT_I4, then the lVal member for that element is the child ID. else if (vt_output[j].vt == VT_I4) { hr = accParent->get_accChild(vt_output[j], &disp); //If a child is an element, get_accChild returns S_FALSE, and the parent will provide information for that child. if (!SUCCEEDED(hr) || !disp) { //element deal varChild.vt = VT_I4; varChild.lVal = vt_output[j].lVal; *paccChild = accParent; } } else //未发现有进入 { continue; } if (disp) { hr = disp->QueryInterface(IID_IAccessible, (void**)&pCAcc); if (FAILED(hr)) continue; varChild.vt = VT_I4; varChild.lVal = CHILDID_SELF; *paccChild = pCAcc; } // Skip invisible and unavailable objects and their children GetObjectStateString(*paccChild, &varChild, szObjState, MAX_PATH); // if (NULL != _tcsstr(szObjState, _T("unavailable"))) // { // if (pCAcc) // pCAcc->Release(); // continue; // } UINT nState = 0; GetObjectState(*paccChild, &varChild, nState); // check if object is available if ((nState & STATE_SYSTEM_UNAVAILABLE /*STATE_SYSTEM_INVISIBLE*/ /*| STATE_SYSTEM_OFFSCREEN*/)) { SAFE_RELEASE(pCAcc); continue; } GetObjectName(*paccChild, &varChild, szObjName, MAX_PATH); GetObjectRoleString(*paccChild, &varChild, szObjRole, MAX_PATH); //GetObjectClass(*paccChild, szObjClass, sizeof(szObjClass)); memset(szObjClass, 0, sizeof(szObjClass)); HWND hwndChild = 0; WindowFromAccessibleObject(*paccChild, &hwndChild); if (hwndChild) GetClassName(hwndChild, szObjClass, MAX_PATH); if ((!szName || !_tcscmp(szName, szObjName)) && (!szRole || !_tcscmp(szRole, szObjRole)) && (!szClass || !_tcscmp(szClass, szObjClass))) { found = true; *pvarChild = varChild; break; } if (pCAcc) DEBUGTRACE("%s name=%s, role=%s, class=%s, state=%s obj=0x%p,idx=0x%p", g_sSubPrefix.c_str(), szObjName, szObjRole, szObjClass, szObjState, pCAcc, varChild.lVal); else DEBUGTRACE("%s name=%s, role=%s, class=%s, state=%s elem,idx=0x%p", g_sSubPrefix.c_str(), szObjName, szObjRole, szObjClass, szObjState, varChild.lVal); if (!found && pCAcc) { string sParentPrefix = g_sSubPrefix; g_sSubPrefix += " "; // Go deeper found = FindAccessible(pCAcc, szName, szRole, szClass, paccChild, pvarChild); if (*paccChild != pCAcc) pCAcc->Release(); g_sSubPrefix = sParentPrefix; } } exit: if (vt_output) { for (int k = 0; k < lChildCount; k++) VariantClear(&vt_output[k]); delete vt_output; } return found; } ``` 运行的遍历错误结果: obj=0x00E088C8, numChildren=7 name=系统, role=菜单栏, class=MHPToolBar obj=0x00E03FA0,idx=1 obj=0x00E03FA0, numChildren=0 name=, role=标题栏, class=MHPToolBar obj=0x00E051C0,idx=2 obj=0x00E051C0, numChildren=5 name=输入法, role=按下按钮, class=MHPToolBar elem,idx=1 name=最小化, role=按下按钮, class=MHPToolBar elem,idx=2 name=最大化, role=按下按钮, class=MHPToolBar elem,idx=3 name=上下文帮助, role=按下按钮, class=MHPToolBar elem,idx=4 name=关闭, role=按下按钮, class=MHPToolBar elem,idx=5 name=应用程序, role=菜单栏, class=MHPToolBar obj=0x00E2F598,idx=3 <-----这里开始遍历数据就不一样了,没有得到预期的role=工具栏 obj=0x00E2F598, numChildren=0 name=MainViewBar, role=客户端, class=MHPToolBar obj=0x00E2F388,idx=4 obj=0x00E2F388, numChildren=1 name=, role=窗口, class=ComboBox obj=0x00E2F6F8,idx=1 obj=0x00E2F6F8, numChildren=7 name=系统, role=菜单栏, class=ComboBox obj=0x00E2F5F0,idx=1 obj=0x00E2F5F0, numChildren=0 name=, role=标题栏, class=ComboBox obj=0x00E2F648,idx=2 obj=0x00E2F648, numChildren=5 name=输入法, role=按下按钮, class=ComboBox elem,idx=1 name=最小化, role=按下按钮, class=ComboBox elem,idx=2 name=最大化, role=按下按钮, class=ComboBox elem,idx=3 name=上下文帮助, role=按下按钮, class=ComboBox elem,idx=4 name=关闭, role=按下按钮, class=ComboBox elem,idx=5 name=应用程序, role=菜单栏, class=ComboBox obj=0x00E2F4E8,idx=3 详细工程: http://bbs.pediy.com/showthread.php?t=214638
为什么我的图片显示成灰色,鼠标一直显示忙碌呢?
各位大神,大家好 我使用opencv的imshow显示图片,但是窗口能正常显示,但是图片一直为灰色,而且鼠标显示忙碌,然后会自动退出。在网上查询许久不得要领,小白一枚,劳烦各位帮忙看看是什么原因,谢谢orz ``` #include<opencv2\opencv.hpp> #include "../include/Pipeline.h" using namespace pr; using namespace cv; void TEST_PIPELINE(){ /* 定义模型 */ pr::PipelinePR prc("../lpr/model/cascade.xml", "../lpr/model/HorizonalFinemapping.prototxt","../lpr/model/HorizonalFinemapping.caffemodel", "../lpr/model/Segmentation.prototxt","../lpr/model/Segmentation.caffemodel", "../lpr/model/CharacterRecognization.prototxt","../lpr/model/CharacterRecognization.caffemodel" //"../Ipr/model/SegmentationFree.prototxt", "../Ipr/model/SegmentationFree.caffemodel" ); Mat image = imread("C:\\Users\\wysdy\\Desktop\\HyperLPR-master\\Prj-Win\\1.jpg"); imshow("image",image); waitKey(25); /* 申明一个存储该图片车牌信息检测结果的列表,读取结果 */ std::vector<pr::PlateInfo> res = prc.RunPiplineAsImage(image); float conf = 0 ; /* 开始对每一个结果进行遍历 */ for(auto st:res) { if(st.confidence>0.75) { std::cout << st.getPlateName() << " " << st.confidence << std::endl; conf += st.confidence; //waitKey(0); } } std::cout<<conf<<std::endl; system("pause"); } int main() { TEST_PIPELINE(); return 0 ; } ```
如何在JS里显示不同的弹出div层,同时JS里有弹出层的方法?
问题是这样的,弹出层已经在JS里写好了,效果也有,可是我的页面有很多个div弹出层,要求点击页面中不同的文字时,弹出不同的div层,其他的div层隐藏,如何写方法,等。。。。。。。。。 在以下方法里 function testMessageBox2(ev) { var objPos = mousePosition(ev); messContent=" <div style='padding:0px 0 0px 0;text-align:center; '> 要要 </div>"; showMessageBox('要要',messContent,objPos,580,100); } 我想把div显示与隐藏用这个方法控制: function divshow1() { if(document.getElementById("divFunction22").style.display=="none") { document.getElementById("divFunction22").style.display="block"; } else { document.getElementById("divFunction22").style.display="none"; } } 页面如下: <body> <div> <Table> <TR> <td> <a >查看详细 </a> </td> <td> <a >查看详细 </a> </td> </tr> </table> </div> <div id="弹出层1"> <p> </p> </div> <div id="弹出层2"> <p> </p> </div> <div id="弹出层3"> <p> </p> </div> </body> 麻烦各位高手,我实在是把这些方法合起来,有经验的帮帮? 写个方法??/ [b]问题补充:[/b] 我先试试呀,谢谢你的回答呀 [b]问题补充:[/b] 我的弹出层可能不止3个,有10几个呢? 那个IF ELSE不行吧? 还有个问题是,我的弹出层里也有DIV,如何把内容放进去呀 function testMessageBox2(ev) { var objPos = mousePosition(ev); messContent=" <div style='padding:0px 0 0px 0;text-align:center; '> 要要 </div>"; showMessageBox('要要',messContent,objPos,580,100); } 一个DIV层有一个这个方法? [b]问题补充:[/b] 这是弹出层JS脚本:全部定义的div var isIe=(document.all)?true:false; //设置select的可见状态 function setSelectState(state) { var objl=document.getElementsByTagName('select'); for(var i=0;i <objl.length;i++) { objl[i].style.visibility=state; } } function mousePosition(ev) { if(ev.pageX || ev.pageY) { return {x:ev.pageX, y:ev.pageY}; } return { x:ev.clientX + document.body.scrollLeft - document.body.clientLeft,y:ev.clientY + document.body.scrollTop - document.body.clientTop }; } //弹出方法 function showMessageBox(wTitle,content,pos,wWidth) { closeWindow(); var bWidth=parseInt(document.documentElement.scrollWidth); var bHeight=parseInt(document.documentElement.scrollHeight); if(isIe){ setSelectState('hidden');} var back=document.createElement("div"); back.id="back"; var styleStr="top:0px;left:0px;position:absolute;background:#666;width:"+bWidth+"px;height:"+bHeight+"px;"; styleStr+=(isIe)?"filter:alpha(opacity=0);":"opacity:0;"; back.style.cssText=styleStr; document.body.appendChild(back); showBackground(back,50); var mesW=document.createElement("div"); mesW.id="mesWindow"; mesW.className="mesWindow"; /*控制弹出层TITLE的类*/ mesW.innerHTML=" <div class='mesWindowTop' > <table width='100%' height='100%' style='background- color:#ffffff;'> <tr> <td>"+wTitle+" </td> <td style='width:1px;'> <input type='button' onclick='closeWindow();' title='关闭窗口' class='close' value='关闭' /> </td> </tr> </table> </div> <div class='mesWindowContent' id='mesWindowContent' >"+content+" </div> <div class='mesWindowBottom'> </div>"; styleStr="left:"+(((pos.x-wWidth)>0)?(pos.x-wWidth):pos.x)+"px;top:"+(pos.y)+"px;position:absolute;width:"+wWidth+"px;"; mesW.style.cssText=styleStr; document.body.appendChild(mesW); } //让背景渐渐变暗 function showBackground(obj,endInt) { if(isIe) { obj.filters.alpha.opacity+=1; if(obj.filters.alpha.opacity <endInt) { setTimeout(function(){showBackground(obj,endInt)},5); } }else{ var al=parseFloat(obj.style.opacity);al+=0.01; obj.style.opacity=al; if(al <(endInt/100)) {setTimeout(function(){showBackground(obj,endInt)},5);} } } //关闭窗口 function closeWindow() { if(document.getElementById('back')!=null) { document.getElementById('back').parentNode.removeChild(document.getElementById('back')); } if(document.getElementById('mesWindow')!=null) { document.getElementById('mesWindow').parentNode.removeChild(document.getElementById('mesWindow')); } if(isIe){ setSelectState('');} } function testMessageBox1(ev) { var objPos = mousePosition(ev); messContent=" <div style='padding:0px 0 0px 0;text-align:center;width:100% '> <table> <tr> <td> <p>组织两年内即将退休员工人数为 </p> </td> </tr> </table> </div>"; showMessageBox('数为',messContent,objPos,580,0); [b]问题补充:[/b] 如何把不的DIV层的内容放进弹出层里? [b]问题补充:[/b] 帮忙写全点呀 我不知道为什么,我把JS拿进去测试,有脚本错误? [b]问题补充:[/b] <tr> td align="center" style="width:120px" class="linebottom lineleft "><a onclick="aa1()" href="#none">查看详细</a></td> </tr> 我的弹出层事件就不能放了呀onclick="testMessageBox1 如何把两个联系起来呀 [b]问题补充:[/b] 是这样嘛<a onclick="aa1(testMessageBox1)">a </a> [b]问题补充:[/b] 我把你的代码: 3.<script lanugage="javascript"> 4. function dis(){ 5. var t=document.getElementsByTagName("div"); 6. for(i=0;i<t.length;i++){ 7. if(t[i].style.background=="#fffffe"){ 8. t[i].style.display="none"; 9. } 10. } 11. } 12. function aa1(){ 13. dis(); 14. document.getElementById("a1").style.display=""; 15. } 16. function aa2(){ 17. dis(); 18. document.getElementById("a2").style.display=""; 19. } 20. function aa3(){ 21. dis(); 22. document.getElementById("a3").style.display=""; 23. } 24.</script> 25.</head> 26.<body> 27.<div> 28.<Table> 29.<TR> <td> 30.<a onclick="aa1()">a </a> 31.</td> <td> 32.<a onclick="aa2()">b </a> 33.</td> 34.<td> 35.<a onclick="aa3()">c </a> 36.</td> 37.</tr> 38.</table> 39.</div> 40. 41.<div id="a1" style="display:none;background:#fffffe;"> 42.<div>aaaaaaa</div> 43.</div> 44.<div id="a2" style="display:none;background:#fffffe;"> 45.<div>bbbbbbb</div> 46.</div> 47.<div id="a3" style="display:none;background:#fffffe;"> 48.<div>ccccc</div> 49.</div> 50. 51.</body> 放进去测试 onclick="aa1(testMessageBox1(event))" 有弹出层,但是没有内容,有脚本错误,说没有对象 [b]问题补充:[/b] 它报我弹出DIV层的脚本错误pageX为空, 好像这里面定死了。 [b]问题补充:[/b] 哈哈 :idea: 帮帮我改改,以后会慢慢改进啦 [b]问题补充:[/b] 弹出层有出来但是遮层与显示层好像不同步, DIV层内容好像始终都没有出现过? function testMessageBox1(ev) { var objPos = mousePosition(ev); messContent=" <div style='padding:0px 0 0px 0;text-align:center; '> </div>"; showMessageBox('要要',messContent,objPos,580,100); } 不需要改吧 [b]问题补充:[/b] 当我点弹出层里空白处时,遮层后面就显示不全。 不知道是不是事件问题。 难道我点击<a></a>时,DIV层内容会同步嘛
爬虫福利二 之 妹子图网MM批量下载
爬虫福利一:27报网MM批量下载 点击 看了本文,相信大家对爬虫一定会产生强烈的兴趣,激励自己去学习爬虫,在这里提前祝:大家学有所成! 目标网站:妹子图网 环境:Python3.x 相关第三方模块:requests、beautifulsoup4 Re:各位在测试时只需要将代码里的变量path 指定为你当前系统要保存的路径,使用 python xxx.py 或IDE运行即可。 ...
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
Elastic:菜鸟上手指南
您们好,我是Elastic的刘晓国。如果大家想开始学习Elastic的话,那么这里将是你理想的学习园地。在我的博客几乎涵盖了你想学习的许多方面。在这里,我来讲述一下作为一个菜鸟该如何阅读我的这些博客文章。 我们可以按照如下的步骤来学习: 1)Elasticsearch简介:对Elasticsearch做了一个简单的介绍 2)Elasticsearch中的一些重要概念:cluster, n...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看...
Java知识体系最强总结(2020版)
更新于2019-12-15 10:38:00 本人从事Java开发已多年,平时有记录问题解决方案和总结知识点的习惯,整理了一些有关Java的知识体系,这不是最终版,会不定期的更新。也算是记录自己在从事编程工作的成长足迹,通过博客可以促进博主与阅读者的共同进步,结交更多志同道合的朋友。特此分享给大家,本人见识有限,写的博客难免有错误或者疏忽的地方,还望各位大佬指点,在此表示感激不尽。 文章目录...
计算机专业的书普遍都这么贵,你们都是怎么获取资源的?
介绍几个可以下载编程电子书籍的网站。 1.Github Github上编程书资源很多,你可以根据类型和语言去搜索。推荐几个热门的: free-programming-books-zh_CN:58K 星的GitHub,编程语言、WEB、函数、大数据、操作系统、在线课程、数据库相关书籍应有尽有,共有几百本。 Go语言高级编程:涵盖CGO,Go汇编语言,RPC实现,Protobuf插件实现,Web框架实...
卸载 x 雷某度!GitHub 标星 1.5w+,从此我只用这款全能高速下载工具!
作者 | Rocky0429 来源 | Python空间 大家好,我是 Rocky0429,一个喜欢在网上收集各种资源的蒟蒻… 网上资源眼花缭乱,下载的方式也同样千奇百怪,比如 BT 下载,磁力链接,网盘资源等等等等,下个资源可真不容易,不一样的方式要用不同的下载软件,因此某比较有名的 x 雷和某度网盘成了我经常使用的工具。 作为一个没有钱的穷鬼,某度网盘几十 kb 的下载速度让我...
复习一周,京东+百度一面,不小心都拿了Offer
京东和百度一面都问了啥,面试官百般刁难,可惜我全会。
毕业5年,我问遍了身边的大佬,总结了他们的学习方法
我问了身边10个大佬,总结了他们的学习方法,原来成功都是有迹可循的。
推荐10个堪称神器的学习网站
每天都会收到很多读者的私信,问我:“二哥,有什么推荐的学习网站吗?最近很浮躁,手头的一些网站都看烦了,想看看二哥这里有什么新鲜货。” 今天一早做了个恶梦,梦到被老板辞退了。虽然说在我们公司,只有我辞退老板的份,没有老板辞退我这一说,但是还是被吓得 4 点多都起来了。(主要是因为我掌握着公司所有的核心源码,哈哈哈) 既然 4 点多起来,就得好好利用起来。于是我就挑选了 10 个堪称神器的学习网站,推...
这些软件太强了,Windows必装!尤其程序员!
Windows可谓是大多数人的生产力工具,集娱乐办公于一体,虽然在程序员这个群体中都说苹果是信仰,但是大部分不都是从Windows过来的,而且现在依然有很多的程序员用Windows。 所以,今天我就把我私藏的Windows必装的软件分享给大家,如果有一个你没有用过甚至没有听过,那你就赚了????,这可都是提升你幸福感的高效率生产力工具哦! 走起!???? NO、1 ScreenToGif 屏幕,摄像头和白板...
大学四年因为知道了这32个网站,我成了别人眼中的大神!
依稀记得,毕业那天,我们导员发给我毕业证的时候对我说“你可是咱们系的风云人物啊”,哎呀,别提当时多开心啦????,嗯,我们导员是所有导员中最帅的一个,真的???? 不过,导员说的是实话,很多人都叫我大神的,为啥,因为我知道这32个网站啊,你说强不强????,这次是绝对的干货,看好啦,走起来! PS:每个网站都是学计算机混互联网必须知道的,真的牛杯,我就不过多介绍了,大家自行探索,觉得没用的,尽管留言吐槽吧???? 社...
看完这篇HTTP,跟面试官扯皮就没问题了
我是一名程序员,我的主要编程语言是 Java,我更是一名 Web 开发人员,所以我必须要了解 HTTP,所以本篇文章就来带你从 HTTP 入门到进阶,看完让你有一种恍然大悟、醍醐灌顶的感觉。 最初在有网络之前,我们的电脑都是单机的,单机系统是孤立的,我还记得 05 年前那会儿家里有个电脑,想打电脑游戏还得两个人在一个电脑上玩儿,及其不方便。我就想为什么家里人不让上网,我的同学 xxx 家里有网,每...
史上最全的IDEA快捷键总结
现在Idea成了主流开发工具,这篇博客对其使用的快捷键做了总结,希望对大家的开发工作有所帮助。
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
一文带你看清 HTTP 所有概念
上一篇文章我们大致讲解了一下 HTTP 的基本特征和使用,大家反响很不错,那么本篇文章我们就来深究一下 HTTP 的特性。我们接着上篇文章没有说完的 HTTP 标头继续来介绍(此篇文章会介绍所有标头的概念,但没有深入底层) HTTP 标头 先来回顾一下 HTTP1.1 标头都有哪几种 HTTP 1.1 的标头主要分为四种,通用标头、实体标头、请求标头、响应标头,现在我们来对这几种标头进行介绍 通用...
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东...
【综合篇】浏览器的工作原理:浏览器幕后揭秘
web(给达达前端加星标,提升前端技能)了解浏览器是如何工作的,能够让你站在更高的角度去理解前端浏览器的发展历程的三大路线,第一是应用程序web化,第二是web应用移动化,第三是web操...
破14亿,Python分析我国存在哪些人口危机!
一、背景 二、爬取数据 三、数据分析 1、总人口 2、男女人口比例 3、人口城镇化 4、人口增长率 5、人口老化(抚养比) 6、各省人口 7、世界人口 四、遇到的问题 遇到的问题 1、数据分页,需要获取从1949-2018年数据,观察到有近20年参数:LAST20,由此推测获取近70年的参数可设置为:LAST70 2、2019年数据没有放上去,可以手动添加上去 3、将数据进行 行列转换 4、列名...
作为一个程序员,内存和磁盘的这些事情,你不得不知道啊!!!
截止目前,我已经分享了如下几篇文章: 一个程序在计算机中是如何运行的?超级干货!!! 作为一个程序员,CPU的这些硬核知识你必须会! 作为一个程序员,内存的这些硬核知识你必须懂! 这些知识可以说是我们之前都不太重视的基础知识,可能大家在上大学的时候都学习过了,但是嘞,当时由于老师讲解的没那么有趣,又加上这些知识本身就比较枯燥,所以嘞,大家当初几乎等于没学。 再说啦,学习这些,也看不出来有什么用啊!...
这个世界上人真的分三六九等,你信吗?
偶然间,在知乎上看到一个问题 一时间,勾起了我深深的回忆。 以前在厂里打过两次工,做过家教,干过辅导班,做过中介。零下几度的晚上,贴过广告,满脸、满手地长冻疮。 再回首那段岁月,虽然苦,但让我学会了坚持和忍耐。让我明白了,在这个世界上,无论环境多么的恶劣,只要心存希望,星星之火,亦可燎原。 下文是原回答,希望能对你能有所启发。 如果我说,这个世界上人真的分三六九等,...
B 站上有哪些很好的学习资源?
哇说起B站,在小九眼里就是宝藏般的存在,放年假宅在家时一天刷6、7个小时不在话下,更别提今年的跨年晚会,我简直是跪着看完的!! 最早大家聚在在B站是为了追番,再后来我在上面刷欧美新歌和漂亮小姐姐的舞蹈视频,最近两年我和周围的朋友们已经把B站当作学习教室了,而且学习成本还免费,真是个励志的好平台ヽ(.◕ฺˇд ˇ◕ฺ;)ノ 下面我们就来盘点一下B站上优质的学习资源: 综合类 Oeasy: 综合...
死磕Lambda表达式(二):Lambda的使用
在哪使用Lambda表达式?怎么样正确的使用Lambda表达式?
史上最牛逼的 Eclipse 快捷键,提高开发效率!
如果你在使用IDEA,请参考博主另外的一篇idea快捷键的博客。
在三线城市工作爽吗?
我是一名程序员,从正值青春年华的 24 岁回到三线城市洛阳工作,至今已经 6 年有余。一不小心又暴露了自己的实际年龄,但老读者都知道,我驻颜有术,上次去看房子,业务员肯定地说:“小哥肯定比我小,我今年还不到 24。”我只好强颜欢笑:“你说得对。” 从我拥有记忆到现在进入而立之年,我觉得,我做过最明智的选择有下面三个: 1)高中三年,和一位女同学保持着算不上朋友的冷淡关系;大学半年,把这位女同学追到...
CSS操作之你不得不知的一些小技巧(一)ヾ(Ő∀Ő๑)ノ太棒了!!
目录 CSS单行/多行文本,超出隐藏并显示省略号 1. CSS单行/多行文本,超出隐藏并显示省略号 方法一:使用CSS属性 单行文本溢出显示省略号 width: 100px; overflow: hidden; text-overflow:ellipsis; //文本溢出显示省略号 white-space: nowrap; //文本不会换...
强烈推荐 10 款珍藏的 Chrome 浏览器插件
Firebug 的年代,我是火狐(Mozilla Firefox)浏览器的死忠;但后来不知道为什么,该插件停止了开发,导致我不得不寻求一个新的网页开发工具。那段时间,不少人开始推荐 Chrome 浏览器,我想那就试试吧,期初我觉得用起来很别扭,毕竟我不是一个“喜新厌旧”的人。但用的次数越来越多,也就习惯了。 Chrome 浏览器有一个好处,就是插件极其丰富,只有你想不到的,没有你找不到的,这恐怕是...
我以为我对数据库索引十分了解,直到我遇到了阿里面试官。
索引的数据结构分析,数据库面试到索引最常见的问题分析,我总结了一下。
Java程序员都需要懂的「反射」
前言 只有光头才能变强。 文本已收录至我的GitHub精选文章,欢迎Star:https://github.com/ZhongFuCheng3y/3y 今天来简单写一下Java的反射。本来没打算写反射这个知识点的,只是不少的读者都问过我:“你的知识点好像缺了反射阿。能不能补一下?” 这周末也有点空了,所以来写写我对反射的简单理解。这篇是入门文章,没有高深的知识点,希望能对新人有帮助。如果...
史上最牛逼的 VSCode 插件,提高开发效率!
这篇文章收集了一些常用的vscode插件,提高开发效率。
Java第二周学习
Java第二周学习 1. 数组 1.1 定义数组格式 数据类型[] 数组名 = new 数据类型[容量]; int[] arr = new int[10]; 赋值左侧 数据类型: 告知编译器,当前数组中能够保存的数据类型到底是什么?并且在确定数据类型之后,整个数组中保存的数据类型无法修改!!! []: 告知编译器这里定义的是一个数组类型数据。 明确告知编译器,数组名是一个【引用数据类型...
相关热词 c# singleton c#中类的默认值是 c#各种进制之间的转换 c# 正则表达式保留汉字 c#后台跨域 c#基础代码大全 c#指定combox选择 c#关系 mono c# 相差毫秒 用c#做一个简易计算器
立即提问